我有一个如下的Python pandas DataFrame:
A -- E user0 0 -- 0 11 12 -- 1 12 12 -- 1 13 13 -- 2 14 15 -- 3 15 15 -- 3 16 15 -- 3 17 19 -- 4 28 20 -- 5 29 25 -- 6 210 25 -- 6 2
我想为每个用户从前一组/值集合中减去一行(即,不应该是0)[按E分组]
我的意思是得到如下DataFrame:
A -- E user0 0 -- 0 11 12 -- 1 12 12 -- 1 13 1(即,13-12) -- 2 14 2 ( -- ) -- 3 15 2 -- 3 16 2 -- 3 17 19 -- 4 2 (用户2处不应改变) 8 1 -- 5 29 5(即,25-20) -- 6 210 5(即,25-20) -- 6 2
您能帮我吗…谢谢
回答:
如果E
列是唯一组,请使用DataFrameGroupBy.diff
,用Series.fillna
替换缺失值为原始值,并使用Series.where
和掩码处理连续值(比较不等于移位的值),然后用ffill
向前填充缺失值,最后转换为整数:
df['A1'] = (df.groupby('user')['A'].diff() .fillna(df['A']) .where(df['E'].ne(df['E'].shift())) .ffill() .astype(int))print (df) A E user A10 0 0 1 01 12 1 1 122 12 1 1 123 13 2 1 14 15 3 1 25 15 3 1 26 15 3 1 27 19 4 2 198 20 5 2 19 25 6 2 510 25 6 2 5