使用 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 DataFrame 的条件合并/连接 - Python