elj*_*o67 2 python datetime group-by pandas pandas-groupby
我希望按两列分组:user_id和date; 但是,如果日期足够接近,我希望能够将两个条目视为同一组和组的相应部分.日期是mdy
user_id date val
1 1-1-17 1
2 1-1-17 1
3 1-1-17 1
1 1-1-17 1
1 1-2-17 1
2 1-2-17 1
2 1-10-17 1
3 2-1-17 1
Run Code Online (Sandbox Code Playgroud)
分组将按user_id分组,日期为+/- 3天.所以通过求和val的组看起来像:
user_id date sum(val)
1 1-2-17 3
2 1-2-17 2
2 1-10-17 1
3 1-1-17 1
3 2-1-17 1
Run Code Online (Sandbox Code Playgroud)
有人可以想到这可以(有点)轻松完成吗?我知道这有一些问题.例如,如果日期与三天之间无休止地串起来怎么办.但我使用的确切数据每人只有2个值..
谢谢!
我将其转换为datetime列,然后使用pd.TimeGrouper:
dates = pd.to_datetime(df.date, format='%m-%d-%y')
print(dates)
0 2017-01-01
1 2017-01-01
2 2017-01-01
3 2017-01-01
4 2017-01-02
5 2017-01-02
6 2017-01-10
7 2017-02-01
Name: date, dtype: datetime64[ns]
df = (df.assign(date=dates).set_index('date')
.groupby(['user_id', pd.TimeGrouper('3D')])
.sum()
.reset_index())
print(df)
user_id date val
0 1 2017-01-01 3
1 2 2017-01-01 2
2 2 2017-01-10 1
3 3 2017-01-01 1
4 3 2017-01-31 1
Run Code Online (Sandbox Code Playgroud)
类似的解决方案pd.Grouper:
df = (df.assign(date=dates)
.groupby(['user_id', pd.Grouper(key='date', freq='3D')])
.sum()
.reset_index())
print(df)
user_id date val
0 1 2017-01-01 3
1 2 2017-01-01 2
2 2 2017-01-10 1
3 3 2017-01-01 1
4 3 2017-01-31 1
Run Code Online (Sandbox Code Playgroud)
更新:TimeGrouper将在大熊猫的未来版本中弃用,因此Grouper在这种情况下会更受欢迎(感谢您的抬头,Vaishali!).
| 归档时间: |
|
| 查看次数: |
4848 次 |
| 最近记录: |