熊貓DataFrame提供了一個很好的查詢能力。
什麼你正在嘗試做的可以簡單地用做:
# 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'
這裏的查詢是數據幀的一個強大的工具,可以讓你操縱數據框,因爲你需要。
對於更復雜的條件語句,你可以通過封裝在括號中的每個條件,並將它們與布爾運算符分隔指定多個條件(例如「&」或「|」)
你也可以在這裏看到這樣的用於設置> 18的第二個條件語句。
編輯:
您可以閱讀更多有關數據幀的索引和條件:
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
你不應該使用鏈式分配:http://pandas.pydata.org/pandas-docs/stable/indexing.html #indexing-view-versus-copy你應該做'df.loc [df ['Age']> 40,'Age_Group'] ='> 40'' – EdChum
這是真的。如果更新的條件和列被切換,它不會更新數據幀,而是將被刪除的副本,因爲它永遠不會回到原始數據幀。但是,只要要更新的列首先出現,那麼使用.loc的效果就會相同。但是,我的方式更容易讓一個新來熊貓的人困擾。 –
謝謝 - 我有兩種方法可以工作,但是我會採用非鏈式方法,因爲我認爲它是更安全的方式。2 – user3302483