获取 Pandas 列总数

问题描述 投票:0回答:6

我有一个 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

或者,我希望使用标题为

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
python pandas dataframe sum
6个回答
391
投票

你应该使用

sum

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

然后将

loc
Series
一起使用,在这种情况下,索引应设置为与需要求和的特定列相同:

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

另外两个解决方案是使用

at
ix
请参阅下面的应用程序:

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
已被弃用。请改用
loc
iloc


42
投票

您可以在此处选择另一个选项:

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

11
投票

类似于获取数据帧的长度,

len(df)
,以下内容适用于 pandas 和 blaze:

Total = sum(df['MyColumn'])

或者另一种选择

Total = sum(df.MyColumn)
print Total

5
投票

对列求和有两种方法

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

1: sum(数据集.Column_name)

2: 数据集['Column_Name'].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()

0
投票

多列总计

您可以选择想要总计的列,然后对它们调用

sum()
。要添加新行,请使用
loc[]

df.loc['Total'] = df[['Y', 'Z']].sum()

使用OP中的示例,它进行以下转换(注意新添加的行):


Python 的内置
sum
与 pandas 的
sum
方法

对于单列,我们可以通过两种方式求和:使用Python内置的

sum()
函数和使用pandas的
sum()
方法。需要注意的是,pandas 的方法经过优化,比 Python 的方法快得多
sum()
。例如,要对包含 100 万行的列中的值求和,pandas 的 sum 方法比 Python 的内置
sum()
函数快约 160 倍。

df = pd.DataFrame({'Y': range(1000000)})

%timeit a = df['Y'].sum()
# 1 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit b = sum(df['Y'])
# 160 ms ± 6.1 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

所以尽可能使用 pandas 的方法。

© www.soinside.com 2019 - 2024. All rights reserved.