我有一个数据帧(df),由float64组成,我想把它自己"折叠"起来。它目前的索引是0-30,我需要它在0-9,组合以相同数字结尾的元素(0与10,20和30;1与11、21;例如:
for i in df:
for x in df[i]:
df[i][x] = df[i][x] + df[i][x + 10] + df[i][x + 20] + df[i][x + 30]
由于某种原因,我得到一个KeyError输出第一个[I][x]
EDIT:同样的技术可以应用于任何列,而不仅仅是索引。我最初把这个问题解释为关于指数分组的问题,但我想我可能误解了这一点。OP,如果您想对列x
中的值执行此操作,则执行df.groupby(df["x"] % 10).sum()
。
解决方案可以使用群比和模运算:
df.groupby(df.index % 10).sum()
为了展示它是如何工作的,使用以下示例数据框架:
In [3]: df
Out[3]:
a b
0 0.92 0.21
1 0.17 0.91
2 0.52 0.34
3 0.11 0.50
4 0.23 0.15
5 0.14 0.34
6 0.41 0.83
7 0.11 0.79
8 0.13 0.01
9 0.23 0.25
10 0.24 0.00
11 0.59 0.64
12 0.58 0.16
13 0.20 0.02
14 0.37 0.65
15 0.06 0.21
16 0.26 0.47
17 0.30 0.98
18 0.79 0.45
19 0.70 0.55
使用df.groupby(df.index % 10)
对以相同数字结尾的索引进行分组并打印分组:
In [4]: df.groupby(df.index % 10).apply(print)
a b
0 0.92 0.21
10 0.24 0.00
a b
1 0.17 0.91
11 0.59 0.64
a b
2 0.52 0.34
12 0.58 0.16
a b
3 0.11 0.50
13 0.20 0.02
a b
4 0.23 0.15
14 0.37 0.65
a b
5 0.14 0.34
15 0.06 0.21
a b
6 0.41 0.83
16 0.26 0.47
a b
7 0.11 0.79
17 0.30 0.98
a b
8 0.13 0.01
18 0.79 0.45
a b
9 0.23 0.25
19 0.70 0.55
现在用.sum()
代替.apply(print)
来得到每组的和:
In [5]: df.groupby(df.index % 10).sum()
Out[5]:
a b
0 1.16 0.21
1 0.76 1.55
2 1.10 0.50
3 0.31 0.52
4 0.60 0.80
5 0.20 0.55
6 0.67 1.30
7 0.41 1.77
8 0.92 0.46
9 0.93 0.80