我有一个像这样的数据集:
id date value
1 16-12-1 9
1 16-12-1 8
1 17-1-1 18
2 17-3-4 19
2 17-3-4 20
1 17-4-3 21
2 17-7-13 12
3 17-8-9 12
2 17-9-12 11
1 17-11-12 19
3 17-11-12 21
上面唯一的结构是按日期对行进行排序。
我想做的是,按ID分组并重新采样日期,以便每个ID具有相同的数字值。每月,每周或每天重新采样就足够了。
我的最终数据集(每年重新采样)如下:
id interval value
1 16-12-1 - 17-12-1 75
2 16-12-1 - 17-12-1 62
3 16-12-1 - 17-12-1 33
如何实施?会行得通吗(因为我在date字段中没有秒,即它不是标准的pandas datetime对象)?
dataframe.groupby(id).resample('year')
有什么更快的方法吗?
答案 0 :(得分:2)
更新的尝试
如果您想每年重新采样,这是我的尝试,但是输出结果看起来不像您的预期答案
生成数据
d = [['id', 'date', 'value'],
[1, '2016-12-1', 9],
[1, '2016-12-1',8],
[1, '2017-1-1',18],
[2, '2017-3-4',19],
[2, '2017-3-4',20],
[1,'2017-4-3',21],
[2, '2017-7-13',12],
[3, '2017-8-9',12],
[2, '2017-9-12',11],
[1, '2017-11-12',19],
[3, '2017-11-12',21],]
df = pd.DataFrame(d[1:], columns=d[0])
print(df)
id date value
0 1 2016-12-1 9
1 1 2016-12-1 8
2 1 2017-1-1 18
3 2 2017-3-4 19
4 2 2017-3-4 20
5 1 2017-4-3 21
6 2 2017-7-13 12
7 3 2017-8-9 12
8 2 2017-9-12 11
9 1 2017-11-12 19
10 3 2017-11-12 21
尝试每年重新采样,然后求和
df.index = pd.to_datetime(df.date)
df.drop('date',axis = 1, inplace = True)
df_g = df.groupby('id').resample('y').sum()
df_g.drop(columns=['id'], inplace=True)
print(df_g)
value
id date
1 2016-12-31 17
2017-12-31 58
2 2017-12-31 62
3 2017-12-31 33
初始答案
您可以执行此操作,但是它不会执行明确的resample
操作
f = {'date':['min','max'],
'value':'sum'}
df_grouped = df.groupby(['id']).agg(f)
df_grouped.columns = ['_'.join(col) for col in df_grouped.columns.values]
df_grouped.reset_index(drop=False, inplace=True)
print(df_grouped)
id date_min date_max value_sum
0 1 16-12-1 17-4-3 75
1 2 17-3-4 17-9-12 62
2 3 17-11-12 17-8-9 33
答案 1 :(得分:1)
每周通过ID求和:
df['date'] = pd.to_datetime(df['date'], format='%y-%m-%d')
df = df.set_index('date')
df.groupby('id').resample('W')['value'].agg('sum').loc[lambda x: x>0]
输出:
id date
1 2016-12-04 17
2017-01-01 18
2017-04-09 21
2017-11-12 19
2 2017-03-05 39
2017-07-16 12
2017-09-17 11
3 2017-08-13 12
2017-11-12 21
Name: value, dtype: int64