【问题标题】:Get total of Pandas column获取 Pandas 列的总数
【发布时间】:2022-01-19 03:07:18
【问题描述】:

目标

我有一个 Pandas 数据框,如下所示,有多个列,我想获取列的总数,MyColumn


数据框 - df:

print df

           X           MyColumn  Y              Z   
0          A           84        13.0           69.0   
1          B           76         77.0          127.0   
2          C           28         69.0           16.0   
3          D           28         28.0           31.0   
4          E           19         20.0           85.0   
5          F           84        193.0           70.0   

我的尝试

我尝试使用groupby.sum() 获得列的总和:

Total = df.groupby['MyColumn'].sum()

print Total

这会导致以下错误:

TypeError: 'instancemethod' object has no attribute '__getitem__'

预期输出

我希望输出如下:

319

或者,我希望 df 编辑一个名为 TOTAL 的新 row,其中包含总数:

           X           MyColumn  Y              Z   
0          A           84        13.0           69.0   
1          B           76         77.0          127.0   
2          C           28         69.0           16.0   
3          D           28         28.0           31.0   
4          E           19         20.0           85.0   
5          F           84        193.0           70.0   
TOTAL                  319

【问题讨论】:

  • 为了说明为什么 pandas 不是 Pythonic,只需看看如何简单地对列求和的困惑。

标签: python pandas dataframe sum


【解决方案1】:

你应该使用sum:

Total = df['MyColumn'].sum()
print (Total)
319

然后你使用locSeries,在这种情况下,索引应该设置为与你需要求和的特定列相同:

df.loc['Total'] = pd.Series(df['MyColumn'].sum(), index = ['MyColumn'])
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

因为如果你传递标量,所有行的值都会被填充:

df.loc['Total'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A        84   13.0   69.0
1        B        76   77.0  127.0
2        C        28   69.0   16.0
3        D        28   28.0   31.0
4        E        19   20.0   85.0
5        F        84  193.0   70.0
Total  319       319  319.0  319.0

另外两个解决方案是 atix 请参阅下面的应用程序:

df.at['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

df.ix['Total', 'MyColumn'] = df['MyColumn'].sum()
print (df)
         X  MyColumn      Y      Z
0        A      84.0   13.0   69.0
1        B      76.0   77.0  127.0
2        C      28.0   69.0   16.0
3        D      28.0   28.0   31.0
4        E      19.0   20.0   85.0
5        F      84.0  193.0   70.0
Total  NaN     319.0    NaN    NaN

注意:自 Pandas v0.20 起,ix 已被弃用。请改用lociloc

【讨论】:

  • 太好了 :) 感谢您的解释,请问.loc 在上面的示例中做了什么?
  • at 也适用于放大设置,请参阅上次编辑。
  • 谢谢,有什么首选的方法吗?
  • 嗯,文档说The .loc/.ix/[] operations can perform enlargement when setting a non-existant key for that axis.,所以locix[]。在下一个section 是写at may enlarge the object in-place as above if the indexer is missing. 所以所有方法都很好,但我认为at 是最快的。
【解决方案2】:

您可以在这里使用的另一个选项:

df.loc["Total", "MyColumn"] = df.MyColumn.sum()

#         X  MyColumn      Y       Z
#0        A     84.0    13.0    69.0
#1        B     76.0    77.0   127.0
#2        C     28.0    69.0    16.0
#3        D     28.0    28.0    31.0
#4        E     19.0    20.0    85.0
#5        F     84.0   193.0    70.0
#Total  NaN    319.0     NaN     NaN

你也可以使用append()方法:

df.append(pd.DataFrame(df.MyColumn.sum(), index = ["Total"], columns=["MyColumn"]))


更新:

如果您需要为所有 numeric 列附加总和,您可以执行以下操作之一:

使用append 以功能方式执行此操作(不更改原始数据框):

# select numeric columns and calculate the sums
sums = df.select_dtypes(pd.np.number).sum().rename('total')

# append sums to the data frame
df.append(sums)
#         X  MyColumn      Y      Z
#0        A      84.0   13.0   69.0
#1        B      76.0   77.0  127.0
#2        C      28.0   69.0   16.0
#3        D      28.0   28.0   31.0
#4        E      19.0   20.0   85.0
#5        F      84.0  193.0   70.0
#total  NaN     319.0  400.0  398.0

使用loc 就地改变数据框:

df.loc['total'] = df.select_dtypes(pd.np.number).sum()
df
#         X  MyColumn      Y      Z
#0        A      84.0   13.0   69.0
#1        B      76.0   77.0  127.0
#2        C      28.0   69.0   16.0
#3        D      28.0   28.0   31.0
#4        E      19.0   20.0   85.0
#5        F      84.0  193.0   70.0
#total  NaN     638.0  800.0  796.0

【讨论】:

  • 所有列的总和怎么样?
  • 1.st 示例:FutureWarning: The pandas.np module is deprecated and will be removed from pandas in a future version. Import numpy directly instead
【解决方案3】:

类似于获取数据帧的长度 len(df),以下内容适用于 pandas 和 blaze:

Total = sum(df['MyColumn'])

或者

Total = sum(df.MyColumn)
print Total

【讨论】:

    【解决方案4】:

    作为其他选项,您可以执行以下操作

    Group   Valuation   amount
        0   BKB Tube    156
        1   BKB Tube    143
        2   BKB Tube    67
        3   BAC Tube    176
        4   BAC Tube    39
        5   JDK Tube    75
        6   JDK Tube    35
        7   JDK Tube    155
        8   ETH Tube    38
        9   ETH Tube    56
    

    下面的脚本,可以用于上面的数据

    import pandas as pd    
    data = pd.read_csv("daata1.csv")
    bytreatment = data.groupby('Group')
    bytreatment['amount'].sum()
    

    【讨论】:

      【解决方案5】:

      对一列求和有两种方法

      数据集 = pd.read_csv("data.csv")

      1: sum(dataset.Column_name)

      2:数据集['Column_Name'].sum()

      如果有任何问题,请纠正我..

      【讨论】:

        猜你喜欢
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 2018-12-30
        • 2022-11-10
        • 1970-01-01
        相关资源
        最近更新 更多