比较另一数据帧中一列数据帧的值

时间:2021-05-06 10:34:50

标签: python pandas numpy if-statement

我有 2 个数据框。 df1是

   DATE
2020-05-20
2020-05-21

和 df2 是

ID    NAME    DATE
1     abc     2020-05-20
2     bcd     2020-05-20
3     ggg     2020-05-25
4     jhg     2020-05-26

我想比较 df1 和 df2 的值,例如:取 df1 的第一个值,即 2020-05-20 并在 df2 中找到它并过滤它并显示输出和子集过滤的行。
我的代码是

for index,row in df1.iterrows():
    x = row['DATE']
    if x == df2['DATE']:
        print('Found')
        new = df2[df2['DATE'] == x]
        print(new)
    else:
        print('Not Found')

但我收到以下错误:

ValueError: The truth value of a series is ambigious. Use a.empty,a.bool(),a.item(),a.any()

3 个答案:

答案 0 :(得分:0)

x == df2['DATE'] 是一个 pd.Series (布尔值),而不是单个值。您必须将其减少为单个布尔值才能在条件中对其进行评估。

您可以根据需要使用 .any().all()。我以为你需要 .any() 在这里。

for index,row in df1.iterrows():
    x = row['DATE']
    if (x == df2['DATE']).any():
        print('Found')
        new = df2[df2['DATE'] == x]
        print(new)
    else:
        print('Not Found')

另请参阅 here 以了解此问题的纯 Pandas 解决方案。

答案 1 :(得分:0)

您可以在 df1 中创建一个额外的列并使用 np.where 来填充它。

import numpy as np
df1['Match'] = np.where(df1.DATE.isin(df2.DATE),'Found', 'Not Found')

答案 2 :(得分:0)

这也可以作为 merge 来完成,我认为这使它更清晰一点,因为它只有一行没有分支。您还可以添加 validate 参数以确保每个键在左右数据集中都是唯一的,

import pandas

df1 = pandas.DataFrame(['2020-05-20', '2020-05-21'], columns=['DATE'])
df2 = pandas.DataFrame({'Name': ['abc', 'bcd', 'ggg', 'jgh'], 
                        'DATE': ['2020-05-20', '2020-05-20', '2020-05-25', '2020-05-26']})

df3 = df1.merge(right=df2, on='DATE', how='left')