2014-02-12 27 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

相关问题