[英]Pandas group data frame and sort by column value
我試圖對數據框進行分組,並同時按某個列的絕對值對其進行排序。
groups values foo bar
75 A 3 1 2
77 B -3 31 34
112 A 4 0 4
129 C 50 5 3
134 C -60 44 5
在整個數據幀上,我可以使用
df.reindex(df.values.abs().sort_values(ascending=False).index)
這工作得很好。 但是,對於分組的數據幀,這顯然不起作用。
當我嘗試的時候
df.groupby('groups')['values'].reindex(df.values.abs().sort_values(ascending=False).index)
我得到預期的錯誤:
AttributeError: Cannot access callable attribute 'reindex' of 'SeriesGroupBy' objects, try using the 'apply' method
嘗試apply
可能需要為絕對值另辟一欄,但我不想添加它。 有沒有一種巧妙的方法來實現這一目標?
所需的輸出將是為值列排序的分組數據框(對象):
for groups, data in df_grouped:
print group, data
A,
values foo bar
75 3 1 2
112 4 0 4
B,
values foo bar
77 -3 31 34
C,
values foo bar
134 -60 44 5
129 50 5 3
UPDATE2:
In [433]: for g,x in grp:
.....: print(g, x)
.....:
A groups values foo bar
112 A 4 0 4
77 A 3 1 2
B groups values foo bar
77 B -3 31 34
C groups values foo bar
134 C -60 44 5
129 C 50 5 3
更新:准備分組:
In [428]: grp = (df.assign(abs_val=df['values'].abs())
.....: .sort_values(['groups','abs_val'], ascending=[1,0])
.....: .drop('abs_val', 1)
.....: .groupby('groups'))
In [429]: grp.agg({'foo': ['first','last'], 'bar': ['min','mean','max']})
Out[429]:
foo bar
first last min mean max
groups
A 0 1 2 3 4
B 31 31 34 34 34
C 44 5 3 4 5
舊答案:
In [393]: df.assign(abs_val=df['values'].abs()).sort_values(['groups','abs_val'], ascending=[1,0]).drop('abs_val', 1)
Out[393]:
groups values
112 A 4
77 A 3
77 B -3
134 C -60
129 C 50
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.