我有這個示例資料集:
mydf = pd.DataFrame({'city':['Porto','Loa','Porto','Porto','Loa'],\
'town':['A','C','A','B','C']})
mydf['city'] = pd.Categorical(mydf['city'])
mydf['town'] = pd.Categorical(mydf['town'])
mydf
city town
0 Porto A
1 Loa C
2 Porto A
3 Porto B
4 Loa C
我想計算按城市和城鎮分組的事件。所以我嘗試了這個:
mydf.groupby(['city','town']).size().to_frame()
0
city town
Loa A 0
B 0
C 2
Porto A 2
B 1
C 0
但這是錯誤的,因為城市 C 僅位于 Loa,而不位于波爾圖,而城市 A 和 B 僅位于波爾圖。我的預期結果是這樣的:
0
city town
Loa C 2
Porto A 2
B 1
當然我可以避免pd.Categorical“城市”和“城鎮”的轉換,但我不理解這種行為。是否有我應該使用的引數來避免這種情況并獲得正確和簡化的預期結果?
uj5u.com熱心網友回復:
是的,groupby size行為是預期的。
默認情況下,如果任何分組列是分類的,那么它將顯示分類列的所有值,無論它們是否出現在特定組中。
要關閉此默認行為,您可以設定可選引數observed=True,groupby其中將僅顯示分類列的觀察值(實際出現的值):
mydf.groupby(['city','town'], observed=True).size().to_frame()
0
city town
Porto A 2
B 1
Loa C 2
uj5u.com熱心網友回復:
利用:
from collections import Counter
mydf.groupby(['city'], observed=True)['town'].apply(lambda x: Counter(x))
輸出:
city
Porto A 2.0
B 1.0
Loa C 2.0
Name: town, dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493224.html
下一篇:如何在熊貓中將列屬性切換為行屬性
