我有 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()
答案 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')