获取 Pandas 列的总数
- 2025-04-15 09:19:00
- admin 原创
- 26
问题描述:
我有一个 Pandas 数据框,如下所示,其中包含多列,并且想要获取列的总数MyColumn
。
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
预期输出
我原本期望输出是此列的总数: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
我尝试使用groupby
和来获取列的总和.sum()
:
Total = df.groupby['MyColumn'].sum()
这会导致以下错误:
TypeError: 'instancemethod' object has no attribute '__getitem__'
解决方案 1:
您应该使用sum
:
Total = df['MyColumn'].sum()
print(Total)
319
然后使用loc
with 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
代替。
解决方案 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"]))
更新:
如果您需要为所有数字列附加总和,您可以执行以下操作之一:
使用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
解决方案 3:
与获取数据框的长度类似len(df)
,以下内容适用于 pandas 和 blaze:
Total = sum(df['MyColumn'])
或者
Total = sum(df.MyColumn)
print Total
解决方案 4:
有两种方法可以对列求和
数据集 = pd.read_csv(“data.csv”)
1:总和(数据集.列名)
2:数据集['Column_Name'].sum()
如果其中有任何问题,请纠正我。
解决方案 5:
作为其他选择,您可以执行以下操作
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()
解决方案 6:
多列总计
您可以选择要计算总计的列并调用sum()
它们。要添加新行,请使用loc[]
。
df.loc['Total'] = df[['Y', 'Z']].sum()
使用 OP 中的示例,它进行了以下转换(注意新添加的行):
Python 内置方法sum
vs Pandassum
方法
对于单列,我们可以通过两种方式求和:使用 Python 的内置sum()
函数和使用 Pandas 的sum()
方法。需要注意的是,Pandas 的方法经过优化,比 Python 的方法快得多sum()
。例如,要对一列包含 100 万行的数据求和,Pandas 的 sum 方法比 Python 的内置函数快约 160 倍sum()
。
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)
因此尽可能使用熊猫的方法。
扫码咨询,免费领取项目管理大礼包!