python - 在列中保存每个组/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
解决方案
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
推荐阅读
- printing - 编码新手,如何将多个打印语句组合成一个更好看的语句?
- sql - 删除多个重复行
- logging - Google fluentd - 在标签中使用环境变量
- python - 使用网名和 Tweepy 收集推文
- c++ - 如何将 cmake 变量转换为 C++ 代码中的字符串?
- flutter - 如何在颤动中控制 modalBottomSheet 的宽度?
- php - 如果文本太长,如何在字符达到 20 个字符之前获取单词
- c++ - 在 Windows 上静态链接 ICU
- java - 从java中的用户列表中删除用户
- itertools - 如何在 DolphinDB 中做 itertools.product?