我有以下分組資料框:
Value1 Value2
Category
------------------------------------
0 0 62 44
1 55 46
2 73 75
1 0 61 49
1 55 46
2 34 35
2 0 62 48
1 55 46
2 44 25
我想對于每個組,將“Value1”列重新排序為升序,同時保持“Category”列的順序。目標是“類別”0 將對應于最低的“Value1”值,而“類別”5 將對應于最高的“Value1”值。“Value2”值將對應于它們對應的原始“Value1”值。這是我要生成的輸出資料幀:
Value1 Value2
Category
------------------------------------
0 0 55 46
1 62 44
2 73 75
1 0 34 35
1 55 46
2 61 49
2 0 44 25
1 55 46
2 62 48
我怎樣才能在 python 中完成這個?我試過使用.reset_index()和`.sort_values(),但我只是沒有得到我想要的分組資料框。我試過:
df.sort_values(['Value1'],ascending=True).groupby('Category')
但這只會產生:<pandas.core.groupby.generic.DataFrameGroupBy object at ...>這是沒有用的。
uj5u.com熱心網友回復:
使用sort_values索引名稱的一種方法:
tmp = df.index.names
df.index.names = ["tmp", "Category"]
new_df = df.sort_values(["tmp", "Value1"])
new_df.index = df.index.rename(tmp)
print(new_df)
輸出:
Value1 Value2
Category
0 0 55 46
1 62 44
2 73 75
1 0 34 35
1 55 46
2 61 49
2 0 44 25
1 55 46
2 62 48
uj5u.com熱心網友回復:
您可以按如下方式應用它:
import pandas as pd
df = pd.DataFrame({'col1': [0, 1, 2, 0, 1, 2], 'col2': [8, 9, 6, 40, 3, 20], 'col3': [5, 6, 0, 40, 3, 20]})
sorted_df = df.sort_values(['col2'], ascending=True)
df[['col2', 'col3']] = sorted_df[['col2', 'col3']].values
print(df)
輸出:
col1 col2 col3
0 0 3 3
1 1 6 0
2 2 8 5
3 0 9 6
4 1 20 20
5 2 40 40
uj5u.com熱心網友回復:
您可以在 Values 和第一級索引上對資料框進行排序:
>>> df = (df.sort_values(by=['Value1', 'Value2'])
.sort_index(level=0, sort_remaining=False)
)
Value1 Value2
Category
0 1 55 46
0 62 44
2 73 75
1 2 34 35
1 55 46
0 61 49
2 2 44 25
1 55 46
0 62 48
然后您需要使用cumcount每個組重寫 level1 :
df.sort_values(by=['Value1', 'Value2']).sort_index(level=0, sort_remaining=False)
idx = pd.MultiIndex.from_arrays([df.index.get_level_values(0),
pd.Series(range(len(df))).groupby(df.index.get_level_values(0)).cumcount()],
names=(None, 'Category')
)
df.index = idx
輸出:
Value1 Value2
Category
0 0 55 46
1 62 44
2 73 75
1 0 34 35
1 55 46
2 61 49
2 0 44 25
1 55 46
2 62 48
uj5u.com熱心網友回復:
一號線的解決方案應該是DataFrame.rename_axis有DataFrame.sort_values和DataFrame.set_index:
df = df.rename_axis(index={None:'tmp'}).sort_values(['tmp', "Value1"]).set_index(df.index)
print (df)
Value1 Value2
Category
0 0 55 46
1 62 44
2 73 75
1 0 34 35
1 55 46
2 61 49
2 0 44 25
1 55 46
2 62 48
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/365975.html
