使用 python、pandas 合并 2 个基于 3 个条件的单独 excel 文件

Posted

技术标签:

【中文标题】使用 python、pandas 合并 2 个基于 3 个条件的单独 excel 文件【英文标题】:Merging of 2 separate excel file based 3 condition using python, pandas 【发布时间】:2021-04-26 15:28:01 【问题描述】:

我目前未解决的问题的第一步是Python removing rows with time condition

问题的第 2 步:从第 1 步得到过滤数据后,想根据相同 ID 和类型的条件进行从 DF1 到 DF2 的连接,并将最近的日期时间从 DF 2 连接到 DF 1(日期DF1的时间必须在DF2之后)

例如DF1 - 退出数据

   DatetimeX            ID    Type
   2020-01-01 02:00:01 12345 C
   2020-01-01 02:00:01 13333 D
   2020-01-01 02:00:50 13333 E
   2020-01-01 16:00:01 12211 C
   2020-01-02 21:00:01 12211 C
   2020-01-03 17:00:01 12211 C
   2020-01-04 17:00:01 12211 C
   2020-01-05 21:00:01 12211 C

例如DF2 - 输入数据

   DatetimeE            ID    Type
   2020-01-01 01:00:00 12345 C
   2020-01-01 00:00:01 77777 C
   2020-01-01 00:00:05 12345 C
   2020-01-01 00:00:20 12345 C
   2020-01-01 02:00:05 13333 D
   2020-01-01 04:00:50 13333 E
   2020-01-01 07:00:01 12211 C

加入后的结束状态,例如DF3

   DatetimeX            ID   Type DatetimeE
   2020-01-01 02:00:01 12345 C    2020-01-01 01:00:00 
   2020-01-01 02:00:01 13333 D
   2020-01-01 02:00:50 13333 E
   2020-01-01 02:00:01 12211 C    2020-01-01 01:00:30 
   2020-01-02 21:00:01 12211 C    2020-01-01 07:00:01

我尝试探索 merge 和 merge_asof,但 DF3 的组合数据与任何数据都不匹配。只想请求一些关于如何开始比较的指导。

谢谢!

更新了更多数据样本

【问题讨论】:

DF3 = DF1.merge(DF2, how='left', on=['ID', 'Type'])怎么样 合并需要满足三个条件。 1. ID,2 类型和 3. df2 的最近时间,也不在 df1 的日期时间之后 好的检查解决方案 【参考方案1】:
DF1['DatetimeX'] = pd.to_datetime(DF1['DatetimeX'])
DF2['DatetimeE'] = pd.to_datetime(DF2['DatetimeE'])

output = []

for index, row in DF1.iterrows():
    output.append(DF2[(DF2['ID'] == row['ID']) & (DF2['Type'] == row['Type']) & (DF2['DatetimeE'] < row['DatetimeX'])]['DatetimeE'].max())

DF1['DatetimeE'] = output

使用apply的另一种方式

DF1['DatetimeX'] = pd.to_datetime(DF1['DatetimeX'])
DF2['DatetimeE'] = pd.to_datetime(DF2['DatetimeE'])

DF1['DatetimeE']  = DF1.apply(lambda row: DF2[(DF2['ID'] == row[1]) & (DF2['Type'] == row[2]) & (DF2['DatetimeE'] < row[0])]['DatetimeE'].max(), axis=1)

输出

DatetimeX   ID  Type    DatetimeE
0   2020-01-01 02:00:01 12345   C   2020-01-01 01:00:00
1   2020-01-01 02:00:01 13333   D   NaT
2   2020-01-01 02:00:50 13333   E   NaT
3   2020-01-01 02:00:01 12211   C   2020-01-01 01:00:30

【讨论】:

嗨!我尝试了上述代码,但我的输出全部返回“NaT”。知道为什么吗? 嗨!我注意到您的输出缺少 1 行数据。我的输出示例的最后一行 给我一些时间,我会检查并纠正 谢谢!非常感谢您的帮助!截至目前,我设法使用您的方法合并数据,但遇到重复的 DatetimeE。 “2020-01-01 01:00:30”会在 DatetimeX 的两个时间出现两次

以上是关于使用 python、pandas 合并 2 个基于 3 个条件的单独 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并

Pandas 基于列合并 csv

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

在几天内按日期合并 2 个 Pandas 数据框?

Python pandas:合并两个没有键的表(将 2 个数据帧与广播所有元素相乘;NxN 数据帧)

在 Python 中使用 Pandas 合并时间序列数据帧及其集体附加注释