使用熊猫比较两个数据框的多列

时间:2021-04-29 01:00:11

标签: python pandas

我有两个数据框; 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.Iddf1.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 新手,所以请告诉我您可能需要的其他信息。

4 个答案:

答案 0 :(得分:1)

使用 isinboolean 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=1date=2020-09-11)。您可以通过执行 .merge() 并检查 df2 的日期字段何时不为空来检查两者:

df1['match'] = df1.merge(df2, how='left', left_on=['Id', 'sendDate'], right_on=['Id', 'actDate'])['actDate'].notnull()

答案 2 :(得分:1)

通过 vectorizednumpy 方法 -

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