![](/img/trans.png)
[英]Concatenate strings with pandas GroupBy based on ordering from another column
[英]Pandas ordering based on column value
我有一個熊貓數據框,如:
我有如下所示的數據框,
Input DataFrame
id ratio
0 1 5.00%
1 2 9.00%
2 3 6.00%
3 2 13.00%
4 1 19.00%
5 4 30.00%
6 3 5.5%
7 2 22.00%
我如何才能像這樣分組
id ratio
0 1 5.00%
4 1 19.00%
6 3 5.5%
2 3 6.00%
1 2 9.00%
3 2 13.00%
7 2 22.00%
5 4 30.00%
所以基本上首先查看比率,取該值的最低值,並將其具有相同 id 的其余行分組。 然后尋找第二低的比率並再次對其余的 id 進行分組等等。
首先將您的ratio
列轉換為數字。
然后我們通過使用Groupby
獲得每組的最低rank
最后,我們根據rank
和numeric ratio
排序。
df['ratio_num'] = df['ratio'].str[:-1].astype(float).rank()
df['rank'] = df.groupby('id')['ratio_num'].transform('min')
df = df.sort_values(['rank', 'ratio_num']).drop(columns=['rank', 'ratio_num'])
id ratio
0 1 5.00%
1 1 19.00%
2 3 5.5%
3 3 6.00%
4 2 9.00%
5 2 13.00%
6 2 22.00%
7 4 30.00%
在pd.Categorical
幫助下:
d = {'id':[1, 2, 3, 2, 1, 4, 3, 2],
'ratio': ['5.00%', '9.00%', '6.00%', '13.00%', '19.00%', '30.00%', '5.5%', '22.00%']}
df = pd.DataFrame(d)
df['ratio_'] = df['ratio'].map(lambda x: float(x[:-1]))
df['id'] = pd.Categorical(df['id'], categories=df.sort_values(['id', 'ratio_']).groupby('id').head(1).sort_values(['ratio_', 'id'])['id'], ordered=True)
print(df.sort_values(['id', 'ratio_']).drop('ratio_', axis=1))
印刷:
id ratio
0 1 5.00%
4 1 19.00%
6 3 5.5%
2 3 6.00%
1 2 9.00%
3 2 13.00%
7 2 22.00%
5 4 30.00%
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.