【发布时间】:2018-07-16 17:34:56
【问题描述】:
有一种方法可以根据其他两列的条件移动数据框列吗?类似:
df["cumulated_closed_value"] = df.groupby("user").['close_cumsum'].shiftWhile(df['close_time']>df['open_time])
我已经想出了一个办法,但是效率很低:
1)加载数据并创建要移位的列
df=pd.read_csv('data.csv')
df.sort_values(['user','close_time'],inplace=True)
df['close_cumsum']=df.groupby('user')['value'].cumsum()
df.sort_values(['user','open_time'],inplace=True)
print(df)
输出:
user open_time close_time value close_cumsum
0 1 2017-01-01 2017-03-01 5 18
1 1 2017-01-02 2017-02-01 6 6
2 1 2017-02-03 2017-02-05 7 13
3 1 2017-02-07 2017-04-01 3 21
4 1 2017-09-07 2017-09-11 1 22
5 2 2018-01-01 2018-02-01 15 15
6 2 2018-03-01 2018-04-01 3 18
2) 使用自连接和一些过滤器移动列
自连接(内存效率低)df2=pd.merge(df[['user','open_time']],df[['user','close_time','close_cumsum']], on='user')
过滤“close_time”
df2=df2[df2['close_time']<df2['open_time']]
idx = df2.groupby(['user','open_time'])['close_time'].transform(max) == df2['close_time']
df2=df2[idx]
3)与原始数据集合并:
df3=pd.merge(df[['user','open_time','close_time','value']],df2[['user','open_time','close_cumsum']],how='left')
print(df3)
输出:
user open_time close_time value close_cumsum
0 1 2017-01-01 2017-03-01 5 NaN
1 1 2017-01-02 2017-02-01 6 NaN
2 1 2017-02-03 2017-02-05 7 6.0
3 1 2017-02-07 2017-04-01 3 13.0
4 1 2017-09-07 2017-09-11 1 21.0
5 2 2018-01-01 2018-02-01 15 NaN
6 2 2018-03-01 2018-04-01 3 15.0
还有更多的 pandas 方法可以获得相同的结果吗?
编辑:我添加了一条数据线以使案例更清晰。 我的目标是在新交易开始时间之前完成所有交易的总和
【问题讨论】:
-
@Wen 的回答有什么问题吗?似乎在温的回答之后添加了赏金,但我认为温的回答没有任何问题。如果你想要更多或不同的东西,你能详细说明吗?
-
好的,既然你改变了问题,我正在更新我的答案
标签: python pandas datetime data-analysis