[英]How do I Pandas group-by to get sum?
我正在使用這個數據框:
Fruit Date Name Number
Apples 10/6/2016 Bob 7
Apples 10/6/2016 Bob 8
Apples 10/6/2016 Mike 9
Apples 10/7/2016 Steve 10
Apples 10/7/2016 Bob 1
Oranges 10/7/2016 Bob 2
Oranges 10/6/2016 Tom 15
Oranges 10/6/2016 Mike 57
Oranges 10/6/2016 Bob 65
Oranges 10/7/2016 Tony 1
Grapes 10/7/2016 Bob 1
Grapes 10/7/2016 Tom 87
Grapes 10/7/2016 Bob 22
Grapes 10/7/2016 Bob 12
Grapes 10/7/2016 Tony 15
我想按Name
匯總,然后按Fruit
匯總,以獲得每個Name
的Fruit
總數。 例如:
Bob,Apples,16
我嘗試按Name
和Fruit
分組,但如何獲得Fruit
的總數?
使用GroupBy.sum
:
df.groupby(['Fruit','Name']).sum()
Out[31]:
Number
Fruit Name
Apples Bob 16
Mike 9
Steve 10
Grapes Bob 35
Tom 87
Tony 15
Oranges Bob 67
Mike 57
Tom 15
Tony 1
您也可以使用 agg 功能,
df.groupby(['Name', 'Fruit'])['Number'].agg('sum')
如果要保留原始列Fruit
和Name
,請使用reset_index()
。 否則Fruit
和Name
將成為索引的一部分。
df.groupby(['Fruit','Name'])['Number'].sum().reset_index()
Fruit Name Number
Apples Bob 16
Apples Mike 9
Apples Steve 10
Grapes Bob 35
Grapes Tom 87
Grapes Tony 15
Oranges Bob 67
Oranges Mike 57
Oranges Tom 15
Oranges Tony 1
如其他答案所示:
df.groupby(['Fruit','Name'])['Number'].sum()
Number
Fruit Name
Apples Bob 16
Mike 9
Steve 10
Grapes Bob 35
Tom 87
Tony 15
Oranges Bob 67
Mike 57
Tom 15
Tony 1
其他兩個答案都完成了你想要的。
您可以使用數據pivot
功能將數據排列在漂亮的表格中
df.groupby(['Fruit','Name'],as_index = False).sum().pivot('Fruit','Name').fillna(0)
Name Bob Mike Steve Tom Tony
Fruit
Apples 16.0 9.0 10.0 0.0 0.0
Grapes 35.0 0.0 0.0 87.0 15.0
Oranges 67.0 57.0 0.0 15.0 1.0
df.groupby(['Fruit','Name'])['Number'].sum()
您可以選擇不同的列來對數字求和。
.agg() 函數的變體; 提供以下能力:(1) 持久化類型 DataFrame,(2) 應用平均值、計數、求和等,以及 (3) 在多列上啟用 groupby,同時保持易讀性。
df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})
使用你的價值觀...
df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
您可以將groupby
列設置為index
,然后使用sum
和level
df.set_index(['Fruit','Name']).sum(level=[0,1])
Out[175]:
Number
Fruit Name
Apples Bob 16
Mike 9
Steve 10
Oranges Bob 67
Tom 15
Mike 57
Tony 1
Grapes Bob 35
Tom 87
Tony 15
您還可以在 group by 之后對列Number
使用transform() 。 此操作將使用函數sum
計算一組中的總數,結果是與原始數據幀具有相同索引的系列。
df['Number'] = df.groupby(['Fruit', 'Name'])['Number'].transform('sum')
df = df.drop_duplicates(subset=['Fruit', 'Name']).drop('Date', 1)
然后,您可以刪除列Fruit
和Name
上的重復行。 此外,您可以通過指定軸1
( 0
,列為1
)來刪除列Date
。
# print(df)
Fruit Name Number
0 Apples Bob 16
2 Apples Mike 9
3 Apples Steve 10
5 Oranges Bob 67
6 Oranges Tom 15
7 Oranges Mike 57
9 Oranges Tony 1
10 Grapes Bob 35
11 Grapes Tom 87
14 Grapes Tony 15
# You could achieve the same result with functions discussed by others:
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].sum())
# print(df.groupby(['Fruit', 'Name'], as_index=False)['Number'].agg('sum'))
有一個官方教程Group by: split-apply-combine談論你可以在 group by 之后做什么。
您可以使用 dfsql
對於您的問題,它看起來像:
df.sql('SELECT fruit, sum(number) GROUP BY fruit')
https://github.com/mindsdb/dfsql
這是一篇關於它的文章:
如果您希望聚合列具有自定義名稱,例如Total Number
、 Total
等(此處的所有解決方案都會導致聚合列名為Number
的數據框),請使用命名聚合:
df.groupby(['Fruit', 'Name'], as_index=False).agg(**{'Total Number': ('Number', 'sum')})
或(如果自定義名稱不需要包含空格):
df.groupby(['Fruit', 'Name'], as_index=False).agg(Total=('Number', 'sum'))
這相當於 SQL 查詢:
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
說到 SQL,有一個pandasql
模塊,它允許您使用 SQL 語法在本地環境中查詢 pandas 數據幀。 它不是 Pandas 的一部分,因此必須單獨安裝。
#! pip install pandasql
from pandasql import sqldf
sqldf("""
SELECT Fruit, Name, sum(Number) AS Total
FROM df
GROUP BY Fruit, Name
""")
多虧了這個kaggle 課程,您可以克服在熊貓中的分組。
df.groupby(['Fruit','Name']).Number.sum()
Fruit Name
Apples Bob 16
Mike 9
Steve 10
Grapes Bob 35
Tom 87
Tony 15
Oranges Bob 67
Mike 57
Tom 15
Tony 1
Name: Number, dtype: int64
您可以使用 reset_index() 在求和后重置索引
df.groupby(['Fruit','Name'])['Number'].sum().reset_index()
要么
df.groupby(['Fruit','Name'], as_index=False)['Number'].sum()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.