2017-08-16 109 views
1

我有以下結構例如大熊貓數據幀:大熊貓集團通過具有多種功能的應用

id,sex,age,rank,skill 
1,M,9,1,A 
1,M,8,2,G 
1,M,10,3,F 
2,F,10,3,M 
2,F,8,4,W 
2,F,6,4,O 
3,M,5,1,Q 
3,M,4,3,N 
3,M,9,4,Y 

凡GROUPBY後,我的期望輸出/應用操作的數據幀是:

id,sex,age,rank,skill 
1,M,8,1,A 
2,F,6,3,M 
3,M,4,1,Q 

換句話說,我正在尋找由ID字段組成的字段,性場不變,年齡值的min(),rank值的min(),以及出現在min()等級值。

我知道多個agg函數可以通過字典傳遞給groupby,但是它如何處理常量或取決於組中另一個字段中函數結果的值,我不明白。

回答

2

在你的預期了的說,它是rankmin,但在你的解釋,你提到這是你max

我的答案基地預計輸出

df.groupby(['id','sex'],as_index=False).agg({'age':'min','rank':'min'}).\ 
merge(df.drop('age',1),on=['id','sex','rank'],how='left') 

Out[931]: 
    id sex age rank skill 
0 1 M 8  1  A 
1 2 F 6  3  M 
2 3 M 4  1  Q 
+0

這絕對是最好的方法。我發現kbball的重組版本更容易遵循。 – Pylander

+0

@Pylander很高興它的幫助〜也一步一步總是很好的遵循,將在我以後的職位考慮。謝謝〜美好的一天 – Wen

1

對於具有常數值的列,您有幾個選項:第一個,最後一個等等。對於與最高(或您的示例中的最小值)等級值對應的技能值,您需要使用idxmin。對於idxmin的工作,技能應該是索引,以便第一步將其設置爲索引。

df.set_index('skill').groupby('id').agg({'sex': 'first', 
             'age': 'min', 
             'rank': ['min', 'idxmin']}) 
Out: 
    sex age rank  
    first min min idxmin 
id      
1  M 8 1  A 
2  F 6 3  M 
3  M 4 1  Q 
+0

感謝您解釋如何集成idxmin。我也糾正排名值min(),我的困惑。還有一個問題,將idxmin輸出重命名爲原始字段名稱很簡單嗎?我很可能在現實世界的例子中需要設置很多列。 – Pylander

+0

@Pylander由於該函數在等級列上被調用,因此該名稱將與該列相關聯。儘管重命名多重索引真的很痛苦。我會從頭開始構建一個扁平列表。溫氏的方法可能更適合可能? – ayhan

+0

是的,我最終看到這種方法的侷限性不幸。非常乾淨的格式,儘管我喜歡。 Wen的答案由kbball重新格式化,最終效果最好。 – Pylander

1

+1文。

煤礦有幾個步驟,但它同樣的想法,也許更容易閱讀,如果你不遵循:

func = {'sex': 'min', 'age': 'min', 'rank': 'min'} 

df_agg = df.groupby('id').agg(func) 
df_agg = df_agg.reset_index() 

df = df.drop('age', 1) 
df = pd.merge(df_agg, df, on = ['id', 'sex', 'rank']) 

設置要應用到每一列的聚合。然後按id,使用agg。您需要在此時重置索引,否則您將無法在下一步執行合併,因爲id將被視爲索引。

df仍然存儲您的原始數據幀。從df下降的年齡,因爲您只需要最小化的年齡,存儲在df_agg中。然後在你期望匹配的列上執行合併:id,性別和等級。你正在合併等級,爲正確的行程提供正確的技能。

+0

我必須給予溫的功勞,但我正在使用你的改編解決方案結束。謝謝! – Pylander