首页 > 解决方案 > 在列中保存每个组/ID 和日期的 previos 条目

问题描述

我在 python 中有一个数据框,具有以下排序格式:

df
Name Date      Value
A    01.01.20  10
A    02.01.20  20
A    03.01.20  15
B    01.01.20  5
B    02.01.20  10
B    03.01.20  5
C    01.01.20  3
C    03.01.20  6

因此,并非每个名称都填写了每个日期,我如何创建一个具有 previos 日期值的新列(如果缺少,只需选择当前值),以便它导致:

Name Date      Value  Previos
A    01.01.20  10     10
A    02.01.20  20     10
A    03.01.20  15     20
B    01.01.20  5      5
B    02.01.20  10     5
B    03.01.20  5      10
C    01.01.20  3      3
C    03.01.20  6      6

标签: pythonpandas

解决方案


DataFrameGroupBy.shift与 一起使用Series.fillna

df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%y')

df['Previos'] = df.groupby('Name')['Value'].shift().fillna(df['Value'])
print (df)
  Name       Date  Value  Previos
0    A 2020-01-01     10     10.0
1    A 2020-01-02     20     10.0
2    A 2020-01-03     15     20.0
3    B 2020-01-01      5      5.0
4    B 2020-01-02     10      5.0
5    B 2020-01-03      5     10.0
6    C 2020-01-01      3      3.0
7    C 2020-01-03      6      3.0

但是,如果需要移动 1 天,那么最后一组中的值相同,例如原始解决方案不同 - 首先创建DatetimeIndex并使用新列DataFrame.join

df['Date'] = pd.to_datetime(df['Date'], format='%d.%m.%y')

df = df.set_index('Date')
s = df.groupby('Name')['Value'].shift(freq='D').rename('Previous')
df = df.join(s, on=['Name','Date']).fillna({'Previous': df['Value']})
print (df)
           Name  Value  Previous
Date                            
2020-01-01    A     10      10.0
2020-01-02    A     20      10.0
2020-01-03    A     15      20.0
2020-01-01    B      5       5.0
2020-01-02    B     10       5.0
2020-01-03    B      5      10.0
2020-01-01    C      3       3.0
2020-01-03    C      6       6.0

推荐阅读