首页 > 解决方案 > 熊猫:按日期移动一列但保留用户

问题描述

我有一个数据框看起来像:

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]

结果是正确的,但我不知道如何将结果放回数据框。

标签: pythonpandas

解决方案


要获得前一天的值,您需要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

推荐阅读