如下面的帖子所述: 基于另一个数据帧中的多个列条件创建多个列
我能够获得所需的输出,但是当我使用大文件运行脚本时,出现内存错误, 有没有办法在上面帖子中提供的相同解决方案中克服此内存错误?如果否,在不遇到内存错误的情况下实现结果的最佳方法是什么
再次添加完整详细信息:
我有 2 个从 csv 文件派生的数据帧 DF1
|BID |Datetime |TrId |Code|LineNumber|Vol |Grade |PId
0|1002867|2019-08-19 01:27:53|1459 |f |10 |33.88|Vd |4
1|1002867|2019-08-19 01:39:05|1460 |f |10 |18.13|EE |5
2|1002867|2019-08-19 01:39:55|1461 |f |10 |21.8 |Ad |9
3|1002867|2019-08-19 01:39:55|1461 |f |20 |500 |Vd |10
4|1002147|2019-08-19 01:26:21|2764 |f |10 |33.86|V9 |3
5|1002147|2019-10-19 01:31:57|2765 |f |10 |3.48 |V9 |2
9|1001257|2019-08-19 01:49:54|11524|f |10 |19.93|Ul |5
DF2
|sId |BID |StartDateTime |EndDateTime
0|10007|1002867|2019-07-26 05:11:05|2019-10-05 21:50:55
1|10006|1002147|2019-08-18 05:11:05|2019-10-05 21:50:55
2|10006|1002147|2019-10-05 21:50:55|2019-11-06 21:50:28
3|10006|1002147|2019-10-06 21:50:28|2019-10-08 03:56:20
4|10006|1002147|2019-10-08 03:56:20|2019-10-09 03:50:35
5|10006|1002147|2019-10-09 03:50:35|2019-10-10 05:12:30
6|10006|1002147|2019-10-10 05:12:30|2019-10-11 05:12:38
7|10009|1002348|2019-09-26 04:21:12|2019-10-06 04:16:00
8|10009|1002348|2019-10-06 04:16:00|2019-10-07 04:11:38
9|10009|1002348|2019-10-07 04:11:38|2019-10-08 04:13:12
请注意,两个数据帧的长度不同
仅当以下条件匹配时,我才想将列 sId、开始日期时间和结束日期时间从 df2 添加到 df1:
如果 DF1。出价 = df2。出价和 df1。日期时间介于 df2 之间。开始日期时间和 df2。结束日期时间
我的结果应如下所示:
|BID |Datetime |TrId |Code|LineNumber|Vol |Grade |PId|sId |StartDateTime |EndDateTime
0|1002867|2019-08-19 01:27:53|1459 |f |10 |33.88|Vd |4 |10007|2019-07-26 05:11:05|2019-10-05 21:50:55
1|1002867|2019-08-19 01:39:05|1460 |f |10 |18.13|EE |5 |10007|2019-07-26 05:11:05|2019-10-05 21:50:55
2|1002867|2019-08-19 01:39:55|1461 |f |10 |21.8 |Ad |9 |10007|2019-07-26 05:11:05|2019-10-05 21:50:55
3|1002867|2019-08-19 01:39:55|1461 |f |20 |500 |Vd |10 |10007|2019-07-26 05:11:05|2019-10-05 21:50:55
4|1002147|2019-08-19 01:26:21|2764 |f |10 |33.86|V9 |3 |10006|2019-08-18 05:11:05|2019-10-05 21:50:55
5|1002147|2019-10-19 01:31:57|2765 |f |10 |3.48 |V9 |2 |10006|2019-10-05 21:50:55|2019-11-06 21:50:28
9|1001257|2019-08-19 01:49:54|11524|f |10 |19.93|Ul |5 |NA |NA |NA
我尝试使用这篇文章中的方法: 基于另一个数据帧中的多个列条件创建列
但是我在结果中只得到站点 ID,而不是开始日期时间和结束日期时间 如何在结果中获取这些列
尝试的代码:
for key, grp in df2.groupby('sId'):
cols = ['BID', 'StartDateTime', 'EndDateTime']
masks = (df1['BID'].eq(bid) & df1['Datetime'].between(start, end) for bid, start, end in grp[cols].itertuples(index=False))
df1.loc[pd.concat(masks, axis=1).any(1), 'sId'] = key
df1['sId'] = df1['sId'].fillna('NA')
print(df1)
这仅打印出来:
|BID |Datetime |TrId |Code|LineNumber|Vol |Grade |PId|sId
0|1002867|2019-08-19 01:27:53|1459 |f |10 |33.88|Vd |4 |10007
1|1002867|2019-08-19 01:39:05|1460 |f |10 |18.13|EE |5 |10007
2|1002867|2019-08-19 01:39:55|1461 |f |10 |21.8 |Ad |9 |10007
3|1002867|2019-08-19 01:39:55|1461 |f |20 |500 |Vd |10 |10007
4|1002147|2019-08-19 01:26:21|2764 |f |10 |33.86|V9 |3 |10006
5|1002147|2019-10-19 01:31:57|2765 |f |10 |3.48 |V9 |2 |10006
9|1001257|2019-08-19 01:49:54|11524|f |10 |19.93|Ul |5 |NA
如前所述,以下内容适用于小组数据:
df3 = pd.merge(df1, df2, on='BID', how="left")
result = df3[df3['Datetime'].between(df3.StartDateTime, df3.EndDateTime) | df3.sId.isna()]
但是将其与大文件一起使用会引发内存错误
安装了 64 位 python,它解决了这个问题