[英]Pandas dataframe grouping by two columns, count and sum
我有以下 df,我想按“名稱”分組,因此有一個“A”和“B”計數列和一個“總銷售額”總和列:
例如轉這個:
data = {'A or B' : ['A','A','B','B','A','B'],
'Name' : ['Ben','Ben','Ben','Sam','Sam','Sam'],
'Sales ($)' : [10,5,2,5,6,7]
}
df=pd.DataFrame(data, columns = ['A or B','Name','Sales ($)'])
所以它看起來像這樣:
grouped_data = {'A' : [2,1],
'B' : [1,2],
'Name' : ['Ben','Sam'],
'Total Sales ($)' : [17,18]
}
df=pd.DataFrame(grouped_data, columns = ['A','B','Name','Total Sales ($)'])
您可以嘗試使用pd.get_dummies
、 join
和groupby
+ sum
:
pd.get_dummies(df['A or B'])\
.join(df.drop('A or B',1))\
.groupby('Name',as_index=False).sum()
Output:
Name A B Sales ($)
0 Ben 2 1 17
1 Sam 1 2 18
細節:
首先,使用get_dummies
將分類變量轉換為虛擬/指標變量:
pd.get_dummies(df['A or B'])
# A B
#0 1 0
#1 1 0
#2 0 1
#3 0 1
#4 1 0
#5 0 1
然后使用連接,將假人與原始 df 與'A or B'
列刪除:
pd.get_dummies(df['A or B']).join(df.drop('A or B',1))
# A B Name Sales ($)
#0 1 0 Ben 10
#1 1 0 Ben 5
#2 0 1 Ben 2
#3 0 1 Sam 5
#4 1 0 Sam 6
#5 0 1 Sam 7
最后,根據名稱進行groupby
+ sum
:
pd.get_dummies(df['A or B']).join(df.drop('A or B',1)).groupby('Name',as_index=False).sum()
# Name A B Sales ($)
#0 Ben 2 1 17
#1 Sam 1 2 18
您可以在groupby
中使用聚合
df.groupby(['Name']).agg(A = ('A or B', lambda x: (x=='A').sum())
,B = ('A or B', lambda x: (x=='B').sum())
,total = ('Sales ($)', 'sum')).reset_index()
#output
Name A B total
0 Ben 2 1 17
1 Sam 1 2 18
逐步解決方案:
import pandas as pd
data = {'A or B' : ['A','A','B','B','A','B'],
'Name' : ['Ben','Ben','Ben','Sam','Sam','Sam'],
'Sales ($)' : [10,5,2,5,6,7]
}
df=pd.DataFrame(data, columns = ['A or B','Name','Sales ($)'])
#first create dummy for 'A or B' column
y = pd.get_dummies(df['A or B'])
#concatenate with original data frame
df=pd.concat([y,df], axis=1)
#delete the column
del df['A or B']
#now do the group by
df=df.groupby('Name').agg({'A':'sum',
'B':'sum',
'Sales ($)': 'sum'})
#reset the index
df.reset_index(level=0, inplace=True)
print(df)
Output:
Name A B Sales ($)
0 Ben 2 1 17
1 Sam 1 2 18
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.