获取 Pandas 列的总数

224

我有一个Pandas数据框如下所示,有多列,想要得到MyColumn这一列的总数。

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

或者,我希望用一个新的行标题为TOTAL来编辑df并包含总数:

或者,我想在df中新增一行,标题为TOTAL,并包含合计数:

           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

27
如果想要举例说明为什么Pandas不够符合Python的风格,那就看看如何简单地对一列进行求和的混淆就可以了。 - user1416227
5个回答

388

你应该使用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 是什么意思吗? - Enigmatic
loc 用于扩展设置 - jezrael
2
哦,文档上说.loc/.ix/[]操作可以在为该轴设置不存在的键时进行扩展。因此,使用locix[]。在下一个部分中写道,如果索引器丢失,则at可能会就地扩展对象。因此,所有方法都可以,但我认为at是最快的。 - jezrael
太好了。通过修改 *df.loc['Total'] = df['MyColumn'].sum()*,是否可以将“总计”放在X列中? - SModi
在Pyspark中,df['col'].sum()的等效语句是什么? - pnv
显示剩余2条评论

41

在这里,你可以选择另一种选项:

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"]))

输入图像描述


更新:

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

使用 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
所有列的总和怎么样? - FaCoffee
未来警告:pandas.np模块已经过时并将在将来的版本中从pandas中删除。请直接导入numpy。 - jaromrax
如何在条形图上将其绘制为百分比? - Mohammad Haris
这个解决方案对我很有效,谢谢。我怎么选择特定的列来计算总和? - snow

11

与获取数据框长度的方式类似,len(df),以下代码同样适用于Pandas和Blaze:

Total = sum(df['MyColumn'])

或者另外一种选择

Total = sum(df.MyColumn)
print Total

5

有两种方式来计算一列的总和

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

1: sum(数据集.列名)

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

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


2
作为另一种选项,您可以像下面这样做。
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接