繁体   English   中英

将基于索引值的计算所得行有效地添加到pandas DataFrame

[英]Efficiently adding calculated rows based on index values to a 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,为每个计算的列应用映射函数,然后重新转置,但我想熊猫可能会使用.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

对于一般情况,您需要定义一个函数(或字典)来处理到不同组的映射。 然后,您可以使用groupby及其通常的功能。

对于您的特定情况,可以通过直接切片Dan Dan所示的索引值来更简单地完成,但是如果您遇到更复杂的情况,即您不能简单地根据连续的块来定义所需的组,则此操作将失败。行。 上面的方法还可以轻松地扩展到您要创建的组不是基于索引而是基于某些其他列的情况(即,将X列中的值在0-10范围之内的所有行组合在一起)。

您说您在未显示的解决方案中使用的“转置”角色可能更容易地由orient关键字参数扮演,该参数在从字典构造DataFrame时可用。

In [23]: df
Out[23]: 
    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

In [24]: dict = {'Red': df.loc[:1].sum(), 
                 'Blue': df.loc[2:3].sum(), 
                 'Green': df.loc[4:].sum()}

In [25]: DataFrame.from_dict(dict, orient='index')
Out[25]: 
        a   b   c
Blue   15  17  19
Green  27  29  31
Red     3   5   7

In [26]: df.append(_)
Out[26]: 
        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

根据您示例中的数字,我假设“> 4”实际上是“> = 4”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM