我有两个数据框; df1 有Id 和sendDate,df2 有Id 和actDate。两个 df 的形状不同 - df2 是一个查找表。可能有多个 Id 实例。
例如
df1 = pd.DataFrame({"Id": [1, 1, 2, 3, 2],
"sendDate": ["2019-09-24", "2020-09-11", "2018-01-06", "2018-01-06", "2019-09-24"]})
df2 = pd.DataFrame({"Id": [1, 2, 2],
"actDate": ["2019-09-24", "2019-09-24", "2020-09-11"]})
我想在 df1 中添加一个布尔值 True/False 来查找 df1.Id == df2.Id
和 df1.sendDate == df2.actDate
的时间。
预期输出会向 df1 添加一列:
df1 = pd.DataFrame({"Id": [1, 1, 2, 3, 2],
"sendDate": ["2019-09-24", "2020-09-11", "2018-01-06", "2018-01-06", "2019-09-24"],
"Match?": [True, False, False, False, True]})
我是 R 的 Python 新手,所以请告诉我您可能需要的其他信息。
答案 0 :(得分:1)
使用 isin 和 boolean indexing
import pandas as pd
df1 = pd.DataFrame({"Id": [1, 1, 2, 3, 2],
"sendDate": ["2019-09-24", "2020-09-11",
"2018-01-06", "2018-01-06",
"2019-09-24"]})
df2 = pd.DataFrame({"Id": [1, 2, 2],
"actDate": ["2019-09-24", "2019-09-24", "2020-09-11"]})
df1['Match'] = (df1['Id'].isin(df2['Id'])) & (df1['sendDate'].isin(df2['actDate']))
print(df1)
输出:
Id sendDate Match
0 1 2019-09-24 True
1 1 2020-09-11 True
2 2 2018-01-06 False
3 3 2018-01-06 False
4 2 2019-09-24 True
答案 1 :(得分:1)
.isin()
方法将查找 ID 和日期条目不一定同时出现的值(例如,您的示例中的 Id=1
和 date=2020-09-11
)。您可以通过执行 .merge()
并检查 df2 的日期字段何时不为空来检查两者:
df1['match'] = df1.merge(df2, how='left', left_on=['Id', 'sendDate'], right_on=['Id', 'actDate'])['actDate'].notnull()
答案 2 :(得分:1)
通过 vectorized
的 numpy
方法 -
import numpy as np
df1['Match'] = np.where((df1['Id'].isin(df2['Id'])) & (df1['sendDate'].isin(df2['actDate'])),True,False)
答案 3 :(得分:0)
您可以使用.isin()
:
df1['id_bool'] = df1.Id.isin(df2.Id)
df1['date_bool'] = df1.sendDate.isin(df2.actDate)
查看文档 here。