使用if语句根据另一个数据框中的值在数据框中创建一列

时间:2018-06-26 13:42:17

标签: python-2.7 pandas

我想做的是:

df = pd.DataFrame({"Person":["John", "Myla", "Mary", "John", "Myla"],
               "Age1": [24, 6, 21, 33, 17],
               "Single": [False, True, True, True, False]})

   Age1 Person Single
 0  24 John False 
 1   6 Myla True 
 2  21 Mary True 
 3  33 John True 
 4  17 Myla False 

从上面的数据框中,我需要添加一个新列,如果该人的年龄超过另一个数据框的年龄,则该列将显示“ 1”。

我的第二个数据帧是这样的:

df2 = pd.DataFrame({"Person":["John", "Myla", "Mary"],
               "Age1": [25, 10, 15] }).set_index(['Person'])

         Age1
 Person 
  John   25
  Myla   10 
  Mary   15 

理想的结果是:

   Age1 Person Single Final
 0 24 John False       0
 1  6 Myla True        0
 2 21 Mary True        1
 3 33 John True        1
 4 17 Myla False       1

因此,我第一张桌子中所有年龄大于第二张桌子中25岁的约翰都将得到1,否则为2。

我尝试用字典来做

a=df2.set_index('Person').T.to_dict('list')

但是我的字典看起来像这样:

{'John': [24L], 'Mary': [15L], 'Myla': [0L]} 

但是这让我非常困惑。我还考虑过合并两个数据框,然后进行比较以创建新列,但是还有其他更直接的选择吗?

或者,如果我设法将第二个ddataframe转换为字典,则可以使用map df ['Final'] = df.Person.map(dictionary),但仍不应该比较年龄。请帮忙。

1 个答案:

答案 0 :(得分:1)

使用map,与lt<)进行比较,最后将布尔掩码转换为整数:

df['Final'] = df['Person'].map(df2['Age1']).lt(df['Age1']).astype(int)
print (df)
  Person  Age1  Single  Final
0   John    24   False      0
1   Myla     6    True      0
2   Mary    21    True      1
3   John    33    True      1
4   Myla    17   False      1

详细信息

print (df['Person'].map(df2['Age1']))
0    25
1    10
2    15
3    25
4    10
Name: Person, dtype: int64