如何在熊猫中应用带有应用功能的lambda?

时间:2019-03-13 17:59:12

标签: python python-3.x pandas lambda apply

我是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"])

但结果相同

有人可以帮助我吗?

3 个答案:

答案 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