在pandas数据帧中查找具有相同列值的行

时间:2017-10-09 08:36:44

标签: python pandas dataframe

我有两个具有不同列大小的数据帧,其中四个列在两个数据帧中可以具有相同的值。我想在df1中创建一个新列,如果df2中有一行具有与'A','B','C'和'D'相同的值作为df1中的行,则取值为1 。如果没有这样的行,我希望该值为0.行“E”和“F”对于检查值并不重要。

是否有可以执行此操作的pandas功能,或者我是否需要循环使用此功能。

例如:

df1 =
A    B    C    D    E    F
1    1    20   20   3    2
1    1    12   14   1    3
2    1    13   43   4    3
2    2    12   34   1    4

df2 =
A    B    C    D    E    
1    3    12   14   2    
1    1    20   20   4   
2    2    21   31   5    
2    2    12   34   8    

预期产出:

df1 =
A    B    C    D    E    F    Target
1    1    20   20   3    2    1
1    1    12   14   1    3    0
2    1    13   43   4    3    0
2    2    12   34   1    4    1

3 个答案:

答案 0 :(得分:2)

这很简单。如果检查两个DataFrame是否相等,它会检查每个元素是否等于相应的元素。

col_list = ['A', 'B', 'C', 'D']
idx = (df1.loc[:,  col_list] == df2.loc[:,  col_list]).all(axis=1)

df1['new_row'] = idx.astype(int)

答案 1 :(得分:1)

我认为您需要merge left join和参数indicator=True,然后将列_mergeeq进行比较(与==相同)并且最后通过astype将布尔TrueFalse转换为10

cols = list('ABCD')
df1['Target'] = pd.merge(df1[cols], 
                      df2[cols], how='left', indicator=True)['_merge'].eq('both').astype(int)
print (df1)

   A  B   C   D  E  F  Target
0  1  1  20  20  3  2       1
1  1  1  12  14  1  3       0
2  2  1  13  43  4  3       0
3  2  2  12  34  1  4       1

详情:

print (pd.merge(df1[cols], df2[cols], how='left', indicator=True))
   A  B   C   D     _merge
0  1  1  20  20       both
1  1  1  12  14  left_only
2  2  1  13  43  left_only
3  2  2  12  34       both

答案 2 :(得分:0)

您可以使用逻辑运算符。您可以查看Logic operator for boolean indexing in PandasElement-wise logical OR in Pandas了解一些想法。

但是你的规范不足以提供解决方案草图,因为我不知道df1中的行应该如何与df2一起使用。是否行数是相同的,并且df1中的每一行应该具有布尔值的列,在同一行A,B,C和D中的df2中的列是相同的?