簡體   English   中英

我如何通過 Pandas 分組來獲得總和?

[英]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匯總,以獲得每個NameFruit總數。 例如:

Bob,Apples,16

我嘗試按NameFruit分組,但如何獲得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')

如果要保留原始列FruitName ,請使用reset_index() 否則FruitName將成為索引的一部分。

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 ,然后使用sumlevel

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)

然后,您可以刪除列FruitName上的重復行。 此外,您可以通過指定軸10 ,列為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

這是一篇關於它的文章:

https://medium.com/riselab/why-every-data-scientist-using-pandas-needs-modin-bringing-sql-to-dataframes-3b216b29a7c0

如果您希望聚合列具有自定義名稱,例如Total NumberTotal等(此處的所有解決方案都會導致聚合列名為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM