获取 Pandas 列的总数
Posted
技术标签:
【中文标题】获取 Pandas 列的总数【英文标题】:Get total of Pandas column 【发布时间】:2017-05-08 06:45:10 【问题描述】:目标
我有一个 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
被编辑为新的 row
,标题为 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
【问题讨论】:
为了说明为什么 pandas 不是 Pythonic,只需看看如何简单地对列求和的困惑。 【参考方案1】:对一列求和有两种方法
数据集 = pd.read_csv("data.csv")
1: sum(dataset.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()
【讨论】:
【参考方案3】:你应该使用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
。
【讨论】:
太好了 :) 感谢您的解释,请问.loc
在上面的示例中做了什么?
loc
代表setting with enlargement。
at
也适用于放大设置,请参阅上次编辑。
谢谢,有什么首选的方法吗?
嗯,文档说The .loc/.ix/[] operations can perform enlargement when setting a non-existant key for that axis.
,所以loc
或ix
或[]
。在下一个section 是写at may enlarge the object in-place as above if the indexer is missing.
所以所有方法都很好,但我认为at
是最快的。【参考方案4】:
您可以在这里使用的另一个选项:
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
【参考方案5】:
类似于获取数据帧的长度 len(df)
,以下内容适用于 pandas 和 blaze:
Total = sum(df['MyColumn'])
或者
Total = sum(df.MyColumn)
print Total
【讨论】:
以上是关于获取 Pandas 列的总数的主要内容,如果未能解决你的问题,请参考以下文章
pandas筛选dataframe数据:获取dataframe的第N行第M列的内容(值)
Pandas / Numpy - 如何获取和比较每列与每列的计数并写入 csv?