2014-02-12 26 views
24

我對Python和熊貓很新,所以這可能是一個明顯的問題。熊貓數據框添加一個基於多個if語句的字段

我有一個在其中列出年齡的數據幀。我想創建一個具有年齡段的新領域。我可以使用lambda語句來捕獲單個if/else語句,但我想使用多個if語句,例如if age < 18 then 'under 18' elif age < 40 then 'under 40' else '>40'

我不認爲我可以使用lambda來做到這一點,但我不知道如何以不同的方式做到這一點。我到目前爲止的代碼如下:

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) 

回答

42

熊貓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 
+5

你不應該使用鏈式分配:http://pandas.pydata.org/pandas-docs/stable/indexing.html #indexing-view-versus-copy你應該做'df.loc [df ['Age']> 40,'Age_Group'] ='> 40'' – EdChum

+0

這是真的。如果更新的條件和列被切換,它不會更新數據幀,而是將被刪除的副本,因爲它永遠不會回到原始數據幀。但是,只要要更新的列首先出現,那麼使用.loc的效果就會相同。但是,我的方式更容易讓一個新來熊貓的人困擾。 –

+0

謝謝 - 我有兩種方法可以工作,但是我會採用非鏈式方法,因爲我認爲它是更安全的方式。2 – user3302483

9

你也可以做一個嵌套np.where()

df['Age_group'] = np.where(df.Age<18, 'under 18', 
          np.where(df.Age<40,'under 40', '>40')) 
+2

處理使用這種嵌套功能的自由使用的代碼庫,它是在這一點上相當難以理解。所以在使用這種方法時只需謹慎一些。 – kuanb

相關問題