高效地将基于索引值的计算行添加到pandas DataFrame中[英] Efficiently adding calculated rows based on index values to a pandas DataFrame

本文是小编为大家收集整理的关于高效地将基于索引值的计算行添加到pandas DataFrame中的处理方法,想解了高效地将基于索引值的计算行添加到pandas DataFrame中的问题怎么解决?高效地将基于索引值的计算行添加到pandas DataFrame中问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个如下格式的 pandas DataFrame:

     a   b   c
0    0   1   2
1    3   4   5
2    6   7   8
3    9  10  11
4   12  13  14
5   15  16  17

我想附加一个计算行,该行根据给定的项目索引值执行一些数学运算,例如添加一行,将所有项目的值相加,索引值 <2,新行的索引标签为"红色".最终,我尝试添加三行将索引值分组:

  • 具有索引值
  • 的项目值总和的行2,标记为"红色"
  • 索引值为 1 的项目值总和的行
  • x<4,标记为"蓝色"
  • 索引值大于 3 的项目值总和的行,标记为"绿色"

理想的输出应该是这样的:

       a   b   c
0      0   1   2
1      3   4   5
2      6   7   8
3      9  10  11
4     12  13  14
5     15  16  17
Red    3   5   7
Blue  15  17  19
Green 27  29  31

我目前的解决方案包括转置 DataFrame,为每个计算列应用映射函数,然后重新转置,但我想 pandas 有一种更有效的方法,可能使用 .append().

编辑:我的优雅的预设列表解决方案(最初使用 .transpose() 但我使用 .groupby() 和 .append() 对其进行了改进):

df = pd.DataFrame(np.arange(18).reshape((6,3)),columns=['a', 'b', 'c'])
df['x'] = ['Red', 'Red', 'Blue', 'Blue', 'Green', 'Green']
df2 = df.groupby('x').sum()
df = df.append(df2)
del df['x']

我更喜欢 BrenBarn 回答的灵活性(见下文).

推荐答案

这是一种方法:

def group(ix):
    if ix < 2:
        return "Red"
    elif 2 <= ix < 4:
        return "Blue"
    else:
        return "Green"

>>> print d
    a   b   c
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
5  15  16  17
>>> print d.append(d.groupby(d.index.to_series().map(group)).sum())
        a   b   c
0       0   1   2
1       3   4   5
2       6   7   8
3       9  10  11
4      12  13  14
5      15  16  17
Blue   15  17  19
Green  27  29  31
Red     3   5   7

对于一般情况,您需要定义一个函数(或 dict)来处理到不同组的映射.然后你就可以使用 groupby 和它通常的能力了.

对于您的特定情况,可以更简单地通过直接切片索引值来完成,如 Dan Allan 所示,但如果您有一个更复杂的情况,即您想要的组不能简单地定义为连续的行块.上面的方法也很容易扩展到您想要创建的组不是基于索引而是基于其他列的情况(即,将列 X 中值在 0-10 范围内的所有行分组在一起,或其他).

本文地址:https://www.itbaoku.cn/post/1727773.html