我有一个数据框,让我们说2列:日期和双打
2017-05-01 2.5
2017-05-02 3.5
... ...
2017-05-17 0.2
2017-05-18 2.5
现在我想做一个groupby并与x行相加。因此,即6行会返回:
2017-05-06 15.6
2017-05-12 13.4
2017-05-18 18.0
有没有一个干净的解决方案来执行此操作而不通过类似这样的for循环运行它:
temp = pd.DataFrame()
j = 0
for i in range(0,len(df.index),6):
temp[df.ix[i]['date']] = df.ix[i:i+6]['value'].sum()
答案 0 :(得分:2)
我猜你正在寻找重新取样。考虑这个数据框
rng = pd.date_range('2017-05-01', periods=18, freq='D')
num = np.random.randint(5,size = 18)
df = pd.DataFrame({'date': rng, 'val': num})
df.resample('6D', on = 'date').sum().reset_index()
将返回
date val
0 2017-05-01 14
1 2017-05-07 11
2 2017-05-13 16
答案 1 :(得分:1)
这是使用groupby
数据帧长度范围的替代解决方案。
使用agg
df.groupby(np.arange(len(df))//6).agg(lambda x: {'date': x.date.iloc[0],
'value': x.value.sum()})
多列您可以将first
(或last
)用于日期,将sum
用于其他列。
group = df.groupby(np.arange(len(df))//6)
pd.concat((group['date'].first(),
group[[c for c in df.columns if c != 'date']].sum()), axis=1)