熊猫:条件转移

是否有一种方法可以根据其他两列上的条件来移动数据帧列?比如:

df[“累计关闭值”]=df.groupby(“用户”).[close\u cumsum'].移位时间(df[“关闭时间”]>df[“打开时间])

我已经找到了一种方法,但效率很低:

1)加载数据并创建要移位的列

df=pd.read\u csv('data.csv'))
df.sort_值(['user','close_time',],inplace=True)
df['close_cumsum']=df.groupby('user')['value'].cumsum()
df.sort_值(['user','open_time',],inplace=True)
打印(df)

输出:

用户打开\u时间关闭\u时间值关闭\u累计
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\u time']],df['user','close\u time','close\u cumsum']],on='user')

筛选“关闭时间”<’开放时间’。然后获取具有最大关闭时间的行

df2=df2[df2['close\u time']<df2['open\u time']]
idx=df2.groupby(['user','open\u time'])['close\u time'])。transform(max)==df2['close\u time']
df2=df2[idx]

3)与原始数据集合并:

df3=pd.merge(df['user','open\u time','close\u time','value']],df2['user','open\u time','close\u cumsum']],how='left')
打印(df3)

输出:

用户打开\u时间关闭\u时间值关闭\u累计
01 2017-01-01 2017-03-01 5 NaN
1 2017-01-02 2017-02-01 6南
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
522018-01-01 2018-02-01 15南
6     2 2018-03-01 2018-04-01      3          15.0

有更多的方法可以获得相同的结果?

编辑:我添加了一行数据,使情况更加清楚。
我的目标是获得新交易开始时间之前关闭的所有交易的总和

我在这里使用一个新的段落记录条件df2['close\u time']<df2[开放时间]

df['New']=((df.open\u time-df.close\u time.shift()).dt.days>0)。shift(-1)
s=df.groupby('user').apply(lambda x:(x['value']*x['New']).cumsum().shift()).reset_index(level=0,drop=True)
s、 loc[~(df.New.shift()=True)]=np.nan
df['Cumsum']=s
df
Out[1043]:
用户打开\u时间关闭\u时间值新累计
01 2017-01-01 2017-03-01 5假NaN
1 2017-01-02 2017-02-01 6真南
2017-02-03 2017-02-05 7真实6
3 1 2017-02-07 2017-04-01 3假13
4 2 2017-01-01 2017-02-01 15真南
5 2 2017-03-01 2017-04-01 3南15

更新:自op更新问题(数据来自Gabriel A)

df['New']=df.user.map(df.groupby('user').close\u time.apply(lambda x:np.array(x)))
df['New1']=df.user.map(df.groupby('user').value.apply(lambda x:np.array(x)))
df['New2']=[[x>m代表y中的m]代表x,y代表zip中的y(df['open_time'],df['New'])]
df['Yourtarget']=列表(映射(总和,df['New2']*df['New1'].值))
drop(['New','New1','New2',1)
Output[1376]:
用户打开\u时间关闭\u时间值Yourtarget
0     1 2016-12-30 2016-12-31      1           0
1     1 2017-01-01 2017-03-01      5           1
2     1 2017-01-02 2017-02-01      6           1
3     1 2017-02-03 2017-02-05      7           7
4     1 2017-02-07 2017-04-01      3          14
5     1 2017-09-07 2017-09-11      1          22
6     2 2018-01-01 2018-02-01     15           0
7     2 2018-03-01 2018-04-01      3          15

发表评论