我是Pandas的初学者,并且尝试了以下操作:
我有两个数据集:
df5 = pd.DataFrame({"id":[1,2,3,4,5]})
df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})
我想使用apply或lambda apply将df5中的ID替换为df6中的实际名称。我尝试了以下方法:
def extract_name2 (x):
name = df6[df6["ID"] == x]["Name"]
return name
df5["id"].apply(extract_name2)
这是我的输出:
Out[120]:
0 1 2 3 4
0 Tom NaN NaN NaN NaN
1 NaN Dick NaN NaN NaN
2 NaN NaN Harry NaN NaN
3 NaN NaN NaN Mike NaN
4 NaN NaN NaN NaN Sam
我也尝试过:
df5["id"].apply(lambda x: df6[df6["ID"] == x]["Name"])
但结果相同
有人可以帮助我吗?
答案 0 :(得分:0)
您说df6[df6["ID"] == x]
时,输出是根据您提供的条件过滤的数据帧。
您需要指定需要过滤后的数据帧的'Name'
列中的第一个单元格值。
这将为您提供所需的结果:
df5['id'].apply(lambda x: df6[df6['ID'] == x]['Name'].iloc[0])
更新:
您也可以不使用apply
来执行此操作。使用merge
:
pd.merge(df5, df6, how='left', left_on='id', right_on='ID')
输出:
id ID Name
1 1 Tom
2 2 Dick
3 3 Harry
4 4 Mike
5 5 Sam
答案 1 :(得分:0)
您需要使用iloc:
df5 = pd.DataFrame({"id":[1,2,3,4,5]})
df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})
def extract_name2 (x):
name = df6[df6["ID"] == x]["Name"].iloc[0]
return name
print(df5["id"].apply(extract_name2))
输出:
0 Tom
1 Dick
2 Harry
3 Mike
4 Sam
答案 2 :(得分:0)
请勿使用apply
。它是一个便利函数,实际上包装了python级循环。这是不得已的方法。相反,您需要按照设计使用的方式使用熊猫索引。在这种情况下,ID是您的索引:
In [1]: import pandas as pd
In [2]: df5 = pd.DataFrame({"id":[1,2,3,4,5]})
...: df6 = pd.DataFrame({"ID":[1,2,3,4,5] ,"Name":["Tom","Dick","Harry","Mike","Sam"]})
...: df6.set_index("ID", inplace=True)
...:
...:
In [3]: df6.Name[df5.id]
Out[3]:
ID
1 Tom
2 Dick
3 Harry
4 Mike
5 Sam
Name: Name, dtype: object
注意
In [5]: df7 = pd.DataFrame({"id":[2,2,1,3,1]})
In [6]: df6.Name[df7.id]
Out[6]:
ID
2 Dick
2 Dick
1 Tom
3 Harry
1 Tom
Name: Name, dtype: object