python - 熊猫:按日期移动一列但保留用户
问题描述
我有一个数据框看起来像:
user_id date balance
A 1 100
A 2 200
A 3 250
B 2 300
B 3 200
我想创建一个新列,即每个用户今天和前一天的余额差。
user_id date balance balance_previous_day
A 1 100 NaN
A 2 200 100
A 3 250 50
B 2 300 NaN
B 3 200 -100
我试过了:
df.groupby (['user_id']).apply (lambda x: np.diff (x.balance, 1))
结果将是:
user_id
A [100, 50]
B [-100]
结果是正确的,但我不知道如何将结果放回数据框。
解决方案
要获得前一天的值,您需要shift
,而不是diff
。GroupBy 完成剩下的工作:
>>> df['balance_previous_day'] = df.groupby('user_id')['balance'].shift()
>>> df
user_id date balance balance_previous_day
0 A 1 100 NaN
1 A 2 200 100.0
2 A 3 250 200.0
3 B 2 300 NaN
4 B 3 200 300.0
请注意,这假设您的日子是为每个用户排序的。
要获得差异:
>>> df['balance_change'] = df.groupby('user_id')['balance'].diff()
>>> df
user_id date balance balance_previous_day balance_change
0 A 1 100 NaN NaN
1 A 2 200 100.0 100.0
2 A 3 250 200.0 50.0
3 B 2 300 NaN NaN
4 B 3 200 300.0 -100.0
推荐阅读
- python - 类型错误:on_ready() 缺少 1 个必需的位置参数:'self' discord.py
- c++ - set.upper_bound() 和 upper_bound(set.begin(), set.end()) stl 的区别
- nutch - 我对 db_redir_temp 有一些疑问
- julia - 检查夏令时 (DST) 是否对 Julia 有效
- nestjs - 通过公共关系获取实体
- html - div内的CSS文本框对齐以及图像
- angular - 执行服务中的方法时如何触发组件中的方法?
- reactjs - 当 2 个输入已满且在本机反应中有效时显示按钮
- python - Scrapy 不能刮桌子,空空如也
- c# - 参数更改时创建组件的新实例