我使用DateTimeIndex了解pandas resampling函数。
但是如何轻松地对整数索引进行重新采样/分组?
以下代码说明了问题并且有效:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB'))
print(df)
A B
0 3 2
1 1 1
2 0 1
3 2 3
4 2 0
5 4 0
6 3 1
7 3 4
8 0 2
9 4 4
# sum of n consecutive elements
n = 3
tuples = [(i, i+n-1) for i in range(0, len(df.index), n)]
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T
print(df_new)
A B
0 4 4
1 8 3
2 6 7
3 4 4
但是,有没有更优雅的方法来实现这一目标?
代码对我来说似乎有点笨拙..
提前致谢!
答案 0 :(得分:2)
您可以将分割索引置于底层并聚合某些功能:
df1 = df.groupby(df.index // n).sum()
如果index不是默认(整数,唯一)按numpy.arange
len
创建的按楼层划分的DataFrame
汇总:
df1 = df.groupby(np.arange(len(df)) // n).sum()
答案 1 :(得分:0)
您可以在索引的整数除以n上使用group by。即。
df.groupby(lambda i: i//n).sum()
这是代码
import numpy as np
import pandas as pd
n=3
df = pd.DataFrame(np.random.randint(5, size=(10, 2)), columns=list('AB'))
print('df:')
print(df)
res = df.groupby(lambda i: i//n).sum()
print('using groupby:')
print(res)
tuples = [(i, i+n-1) for i in range(0, len(df.index), n)]
df_new = pd.concat([df.loc[i[0]:i[1]].sum() for i in tuples], 1).T
print('using your method:')
print(df_new)
和输出
df:
A B
0 1 0
1 3 0
2 1 1
3 0 4
4 3 4
5 0 1
6 0 4
7 4 0
8 0 2
9 2 2
using groupby:
A B
0 5 1
1 3 9
2 4 6
3 2 2
using you method:
A B
0 5 1
1 3 9
2 4 6
3 2 2