Python 如何通过比较两列(达到值的时间间隔)从不同列检索值?
我有以下数据框:Python 如何通过比较两列(达到值的时间间隔)从不同列检索值?,python,pandas,Python,Pandas,我有以下数据框: id date PRC 52wh 0 1 01/02/2010 1.0 1.0 1 1 01/03/2010 2.0 2.0 2 1 01/04/2010 10.0 10.0 3 1 01/05/2010 2.0 10.0 4 1 01/06/2010 0.5 10.0 5 1 01/07/2010 3.0 10.0 6 1 01/08/201
id date PRC 52wh
0 1 01/02/2010 1.0 1.0
1 1 01/03/2010 2.0 2.0
2 1 01/04/2010 10.0 10.0
3 1 01/05/2010 2.0 10.0
4 1 01/06/2010 0.5 10.0
5 1 01/07/2010 3.0 10.0
6 1 01/08/2010 5.0 10.0
7 1 01/09/2010 5.0 10.0
8 1 01/10/2010 7.0 10.0
9 1 01/11/2010 1.0 10.0
10 1 01/12/2010 3.0 10.0
11 2 01/02/2010 4.0 4.0
12 2 01/03/2010 5.0 5.0
13 2 01/04/2010 1.0 5.0
14 2 01/05/2010 2.0 5.0
15 2 01/06/2010 3.0 5.0
16 2 01/55/2055 4.0 3.0
我需要做的是在每一行中创建一列,检索52wh等于价格的日期。因此,只要当前行中的52 wh高于当前行中的PRC,程序就会回顾检查52wh等于PRC的时间。
所需的输出如下:
id date PRC 52wh date_y
2 1 01/02/2010 1.0 1.0 01/02/2010
5 1 01/03/2010 2.0 2.0 01/03/2010
6 1 01/04/2010 10.0 10.0 01/04/2010
7 1 01/05/2010 2.0 10.0 01/04/2010
8 1 01/06/2010 0.5 10.0 01/04/2010
9 1 01/07/2010 3.0 10.0 01/04/2010
10 1 01/08/2010 5.0 10.0 01/04/2010
11 1 01/09/2010 5.0 10.0 01/04/2010
12 1 01/10/2010 7.0 10.0 01/04/2010
13 1 01/11/2010 1.0 10.0 01/04/2010
14 1 01/12/2010 3.0 10.0 01/04/2010
16 2 01/02/2010 4.0 4.0 01/02/2010
17 2 01/03/2010 5.0 5.0 01/03/2010
20 2 01/04/2010 1.0 5.0 01/03/2010
23 2 01/05/2010 2.0 5.0 01/03/2010
26 2 01/06/2010 3.0 5.0 01/03/2010
29 2 01/55/2055 4.0 3.0 01/06/2010
为此,我已经实现了执行此任务的以下代码:
df = df_v1
df['uid'] = df.index
df_desc = df.sort_values('uid', ascending=False)
result = df.merge(df_desc[['PRC','date','uid']], left_on="52wh", right_on="PRC", how="left", suffixes=['', '_y']).drop(columns=['PRC_y'])
highest_uid = result[result.uid >= result.uid_y]
final_result = highest_uid.groupby('uid').head(1)
问题是,我需要在一个至少250MB的csv文件的大数据集上运行它,而这段代码占用的内存太多。我有一个记忆错误,似乎什么都不工作。将文件划分为更小的样本不是一个选项。更改数据类型也不起作用
有人能帮我优化一下这个,让它在一个超过500万行的大文件上运行吗?理想情况下,它可以运行在一个超过300亿行的服务器上:)或者至少是几十亿行。我只有16GB的RAM内存
使小数据框工作的代码是:
import pandas as pd
import numpy as np
df_v1 = pd.DataFrame(data=np.array([[1, '01/02/2010'], [1, '01/03/2010'], [1, '01/04/2010'], [1, '01/05/2010'], [1, '01/06/2010'], [1, '01/07/2010'], [1, '01/08/2010'], [1, '01/09/2010'], [1, '01/10/2010'], [1, '01/11/2010'], [1, '01/12/2010'], [2, '01/02/2010'], [2, '01/03/2010'], [2, '01/04/2010'], [2, '01/05/2010'], [2, '01/06/2010'], [2, '01/07/2010']]),
columns=['id', 'date'])
df_v1['PRC']=1,2,10,2,0.5,3,5,5,7,1,3,4,5,1,2,3,4
df_v1['52wh']=1,2,10,10,10,10,10,10,10,10,10,4,5,5,5,5,3
df_v1 = df_v1.astype({'PRC': 'float64', '52wh': 'float64'})
真希望有人能帮我解决这个问题!!提前谢谢各位 在带有10 mil线路的df上使用此代码需要几分钟才能运行
prc_date_dict = dict()
def a(row):
# update the date value for the most recent PRC
prc_date_dict[row['PRC']] = row['date']
# get the date of the PRC that equals row 52wh
return prc_date_dict[row['52wh']]
df['date_y'] = df.apply(a, axis=1)
编辑:删除冗余,如果,可能运行得更快如果没有与当前行52wh相等的前PRC,则在日期中输入什么?这不能是这种情况,因为52wh是根据前一个实例的最大PRC计算的。我有一个使用dict和apply函数的解决方案,该函数与随机生成的df一起工作。它不使用其他函数,因此效率不高,但不会引起内存错误。我测试了10英里的线路,用了6分钟。这是你需要的解决方案吗?你能在这里分享吗?这样我就可以检查它是否适合我了?谢谢非常感谢你!它很好用。你救了我一天!:)不客气!如果这是你想要的,你能接受这个答案吗?是的,对不起,我是平台上的新手!完成:))