【问题标题】:Merging of 2 separate excel file based 3 condition using python, pandas使用 python、pandas 合并 2 个基于 3 个条件的单独 excel 文件
【发布时间】: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 的日期时间之后
  • 好的检查解决方案

标签: python pandas dataframe spyder


【解决方案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 的两个时间出现两次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 2021-09-27
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多