web-dev-qa-db-ja.com

Pandas dataframeは、複数のifステートメントに基づいてフィールドを追加します

私はPythonとPandasが初めてなので、これは明らかな質問かもしれません。

年齢がリストされたデータフレームがあります。年齢帯のある新しい分野を作りたい。 lambdaステートメントを使用して単一のif/elseステートメントをキャプチャできますが、複数のifを使用したいif age < 18 then 'under 18' Elif age < 40 then 'under 40' else '>40'

私はラムダを使用してこれを行うことができるとは思わないが、異なる方法でそれを行う方法がわからない。私はこれまでにこのコードを持っています:

import pandas as pd
import numpy as n

d = {'Age' : pd.Series([36., 42., 6., 66., 38.]) }

df = pd.DataFrame(d)

df['Age_Group'] =  df['Age'].map(lambda x: '<18' if x < 19 else '>18')

print(df)
32
user3302483

pandas DataFrameはNiceクエリ機能を提供します。

あなたがやろうとしていることは、簡単に行うことができます:

# Set a default value
df['Age_Group'] = '<40'
# Set Age_Group value for all row indexes which Age are greater than 40
df['Age_Group'][df['Age'] > 40] = '>40'
# Set Age_Group value for all row indexes which Age are greater than 18 and < 40
df['Age_Group'][(df['Age'] > 18) & (df['Age'] < 40)] = '>18'
# Set Age_Group value for all row indexes which Age are less than 18
df['Age_Group'][df['Age'] < 18] = '<18'

ここでのクエリはデータフレームの強力なツールであり、必要に応じてDataFrameを操作できます。

より複雑な条件の場合、括弧で各条件をカプセル化し、ブール演算子(例: '&'または '|')で区切ることにより、複数の条件を指定できます。

18以上を設定するための2番目の条件ステートメントについては、ここで作業中にこれを見ることができます。

編集:

DataFrameおよび条件のインデックス付けについて詳しく読むことができます。

http://pandas.pydata.org/pandas-docs/dev/indexing.html#index-objects

編集:

仕組みを確認するには:

>>> d = {'Age' : pd.Series([36., 42., 6., 66., 38.]) }
>>> df = pd.DataFrame(d)
>>> df
   Age
0   36
1   42
2    6
3   66
4   38
>>> df['Age_Group'] = '<40'
>>> df['Age_Group'][df['Age'] > 40] = '>40'
>>> df['Age_Group'][(df['Age'] > 18) & (df['Age'] < 40)] = '>18'
>>> df['Age_Group'][df['Age'] < 18] = '<18'
>>> df
   Age Age_Group
0   36       >18
1   42       >40
2    6       <18
3   66       >40
4   38       >18

編集:

チェーンなしでこれを行う方法を確認するには[EdChumsアプローチを使用]。

>>> df['Age_Group'] = '<40'
>>> df.loc[df['Age'] < 40,'Age_Group'] = '<40'
>>> df.loc[(df['Age'] > 18) & (df['Age'] < 40), 'Age_Group'] = '>18'
>>> df.loc[df['Age'] < 18,'Age_Group'] = '<18'
>>> df
   Age Age_Group
0   36       >18
1   42       <40
2    6       <18
3   66       <40
4   38       >18
54
Ryan G

ネストされたnp.where()を実行することもできます

df['Age_group'] = np.where(df.Age<18, 'under 18',
                           np.where(df.Age<40,'under 40', '>40'))
10
S.Zuo