[英]How to merge two columns of different data frame and if the match is found write "True" in a new column using pandas
我正在从事 pandas 项目。 我有两个类似于波纹管的数据框
DF1 :
Data1 Data2 Data3
Head Cat Fire
Limbs Dog Snow
Eyes Fish Water
Mouth Dragon Air
DF2 :
Data1 Data2
Limbs Dog
Mouth Dragon
Head Cat
基于以上 Dataframe 我需要比较两个 DF,如果找到匹配我需要在单独的列中写“True”,否则为 False
例如:可以说,我选择了 DF2 第一行的组合(肢体,狗)这应该在 DF1 中搜索,因为我们可以看到第二行的组合存在,然后将 DF1 的 Data3 值“Snow”写入 DF2 Data3 值。 如果找到匹配项,还会在新列中打印“True”值。
预计 output
Data1 Data2 Data3 Data4
Limbs Dog Snow True
Mouth Dragon Air True
Head cat Fire True
Eyes Fish Water False
目前,我尝试合并两个 dataframe
当前代码:
df3 = pd.merge(df, valid_req , on=['Data1','Data2' ])
df3
Data1 Data2 Data3
Limbs Dog Snow
Mouth Dragon Air
Head cat Fire
我怎样才能达到预期的output?
您可以为df2
分配一个临时列,然后使用how='left'
merge
:
In [1665]: df2['tmp'] = 1
In [1668]: x = df1.merge(df2, on=['Data1', 'Data2'], how='left')
In [1667]: x
Out[1667]:
Data1 Data2 Data3 tmp
0 Head Cat Fire 1.0
1 Limbs Dog Snow 1.0
2 Eyes Fish Water NaN
3 Mouth Dragon Air 1.0
最后,使用numpy.where
分配新列Data4
基于 if x['tmp'] == 1
then True
, else False
:
In [1668]: import numpy as np
In [1669]: x['Data4'] = np.where(x.tmp.eq(1), True, False)
使用df.drop
删除不必要的tmp
列。 然后x
是你的最终 output :
In [1671]: x.drop('tmp', 1, inplace=True)
In [1672]: x
Out[1672]:
Data1 Data2 Data3 Data4
0 Head Cat Fire True
1 Limbs Dog Snow True
2 Eyes Fish Water False
3 Mouth Dragon Air True
使用DataFrame.merge
和 left join 和indicator=True
参数,然后将新列与both
进行DataFrame.pop
以删除列:
df = df1.merge(df2, on=['Data1', 'Data2'], how='left', indicator=True)
df['Data4'] = df.pop('_merge').eq('both')
print (df)
Data1 Data2 Data3 Data4
0 Head Cat Fire True
1 Limbs Dog Snow True
2 Eyes Fish Water False
3 Mouth Dragon Air True
只需在 DF1 上使用 apply function 即可创建 Data4:
import pandas as pd
DF1 = pd.DataFrame([
["Head", "Cat", "Fire"],
["Limbs", "Dog", "Snow"],
["Eyes", "Fish", "Water"],
["Mouth", "Dragon", "Air"]
], columns=["Data1", "Data2", "Data3"])
DF2 = pd.DataFrame([
["Limbs", "Dog", "Snow"],
["Mouth", "Dragon", "Air"],
["Head", "Cat", "Fire"]
], columns=["Data1", "Data2", "Data3"])
DF1["Data4"] = DF1["Data1"].apply(lambda cell: DF2[DF2["Data1"]==cell]["Data1"].count()>0)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.