[英]Pandas GroupBy and total sum within group
假設我有一個看起來像這樣的數據框:
interview longitude latitude
1 A1 34.2 90.2
2 A1 54.2 23.5
3 A3 32.1 21.5
4 A4 54.3 93.1
5 A2 45.1 29.5
6 A1 NaN NaN
7 A7 NaN NaN
8 A1 NaN NaN
9 A3 23.1 38.2
10 A5 -23.7 -98.4
我希望能夠執行某種groupby方法,將每個子組內的總當前值輸出給我。 因此,所需的輸出如下所示:
interview longitude latitude occurs
1 A1 2 2 4
2 A2 1 1 1
3 A3 2 2 2
4 A4 1 1 1
5 A5 1 1 1
6 A7 0 0 1
我嘗試使用此命令嘗試緯度,但未獲得所需的輸出:
df.groupby(by=['interview', 'latitude'])['interview'].count()
謝謝!
在groupby
+ sum
之前使用notna
s1=(df[['**longitude**','**latitude**']].notna()).groupby(df['**interview**']).sum()
s2=df.groupby(df['**interview**']).size()# note size will count the NaN value as well
pd.concat([s1,s2.to_frame('**occurs** ')],axis=1)
Out[115]:
**longitude** **latitude** **occurs**
**interview**
A1 2.0 2.0 4
A2 1.0 1.0 1
A3 2.0 2.0 2
A4 1.0 1.0 1
A5 1.0 1.0 1
A7 0.0 0.0 1
無需使用agg,只需將列傳遞給groupby。 Count返回非空值的計數
df.groupby('interview')[['interview','longitude','latitude']].count()
interview longitude latitude
interview
A1 4 2 2
A2 1 1 1
A3 2 2 2
A4 1 1 1
A5 1 1 1
A7 1 0 0
這三種不同的實現方式:
import pandas as pd
import numpy as np
data = np.array([
['A1', 'A1', 'A3' ,'A4' ,'A2' ,'A1' ,'A7', 'A1', 'A3', 'A5'],
[34.2, 54.2, 32.1, 54.3, 45.1, np.NaN ,np.NaN ,np.NaN, 23.1, -23.7],
[ 90.2, 23.5, 21.5, 93.1, 29.5, np.NaN,np.NaN ,np.NaN ,38.2, -98.4]])
df = pd.DataFrame({'**interview**':data[0,:],'**longitude**':data[1,:],'**latitude**':data[2,:]})
#first way
df['**occurs**']=1
print(df.groupby('**interview**')[['**longitude**','**latitude**','**occurs**']].count().\
reset_index())
#or
counts=0
gb = df.groupby(['**interview**'])
gb1 = df.groupby(['**interview**','**latitude**'])
counts = gb.size().to_frame(name='**occurs**')
print((counts
.join(gb1.agg({'**longitude**':lambda x: x.notnull().size}))
.join(gb1.agg({'**latitude**': lambda x: x.notnull().size}).rename(columns={'**latitude**': '*latitude*'}))
.reset_index()
))
#second way
counts=0
gb = df.groupby(['**interview**'])
counts = gb.size().to_frame(name='**occurs**')
print((counts
.join(gb.agg({'**longitude**': 'size'}))
.join(gb.agg({'**latitude**': 'size'}))
.reset_index()
))
#Third way this just for compare
print(df.groupby(['**interview**']).agg({'**longitude**':lambda x: x.notnull().sum(),
'**latitude**':lambda x: x.notnull().sum(),
'**interview**': 'size'})\
.rename(columns={'**interview**':'**occurs**'}))
在此處查看代碼: https : //repl.it/repls/OldVirtuousBooleanvalue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.