私の目標は、2つの列を比較して結果列を追加することです。 Rはifelseを使用していますが、パンダのやり方を知る必要があります。
[〜#〜] r [〜#〜]
> head(mau.payment)
log_month user_id install_month payment
1 2013-06 1 2013-04 0
2 2013-06 2 2013-04 0
3 2013-06 3 2013-04 14994
> mau.payment$user.type <-ifelse(mau.payment$install_month == mau.payment$log_month, "install", "existing")
> head(mau.payment)
log_month user_id install_month payment user.type
1 2013-06 1 2013-04 0 existing
2 2013-06 2 2013-04 0 existing
3 2013-06 3 2013-04 14994 existing
4 2013-06 4 2013-04 0 existing
5 2013-06 6 2013-04 0 existing
6 2013-06 7 2013-04 0 existing
パンダ
>>> maupayment
user_id log_month install_month
1 2013-06 2013-04 0
2013-07 2013-04 0
2 2013-06 2013-04 0
3 2013-06 2013-04 14994
いくつかのケースを試しましたが、うまくいきませんでした。文字列比較が機能しないようです。
>>>np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
TypeError: 'str' object cannot be interpreted as an integer
私を手伝ってくれますか?
パンダと派手なバージョン。
>>> pd.version.version
'0.16.2'
>>> np.version.full_version
'1.9.2'
バージョンを更新した後、うまくいきました!
>>> np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
array(['existing', 'install', 'existing', ..., 'install', 'install',
'install'],
dtype='<U8')
pandasを最後のバージョンにアップグレードする必要があります。バージョン0.17.1
では非常にうまく機能するためです。
サンプル(列install_month
の最初の値は、マッチングのために変更されます):
print maupayment
log_month user_id install_month payment
1 2013-06 1 2013-06 0
2 2013-06 2 2013-04 0
3 2013-06 3 2013-04 14994
print np.where(maupayment['log_month'] == maupayment['install_month'], 'install', 'existing')
['install' 'existing' 'existing']
1つのオプションは、無名関数をPandasの適用関数と組み合わせて使用することです。
関数にいくつかのbranchingロジックを設定します。
def if_this_else_that(x, list_of_checks, yes_label, no_label):
if x in list_of_checks:
res = yes_label
else:
res = no_label
return(res)
これは、ラムダからx(以下を参照)、検索対象のlist、yes label、およびを取得します。ラベルなし。
たとえば、IMDBデータセット(imdb_df)を見ているとします。
...そして、映画が成熟しているかどうかを示す「new_rating」という新しい列を追加します。
上記の分岐ロジックとともにPandas apply関数を使用できます。
imdb_df['new_rating'] = imdb_df['Rated'].apply(lambda x: if_this_else_that(x, ['PG', 'PG-13'], 'not mature', 'mature'))
これを別のチェックと組み合わせるが必要な場合もあります。たとえば、IMDBデータセットの一部のエントリはNaNです。次のようにNaNと成熟度の両方をチェック:
imdb_df['new_rating'] = imdb_df['Rated'].apply(lambda x: 'not provided' if x in ['nan'] else if_this_else_that(x, ['PG', 'PG-13'], 'not mature', 'mature'))
この場合、私のNaNは最初に文字列に変換されましたが、明らかに本物のNaNでもこれを行うことができます。