我想做的是:
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),但仍不应该比较年龄。请帮忙。
答案 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