繁体   English   中英

如何合并不同数据框的两列,如果找到匹配项,请使用 pandas 在新列中写入“True”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM