web-dev-qa-db-ja.com

Python / PandasのR / ifelseと同等ですか?文字列の列を比較しますか?

私の目標は、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')
22
zono

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']
17
jezrael

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(以下を参照)、検索対象のlistyes label、およびを取得します。ラベルなし

たとえば、IMDBデータセット(imdb_df)を見ているとします。

enter image description here

...そして、映画が成熟しているかどうかを示す「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'))

enter image description here

これを別のチェックと組み合わせるが必要な場合もあります。たとえば、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でもこれを行うことができます。

1
Cybernetic