我有一個 df 有幾個“屬性”和每個屬性的分數:
df = pd.DataFrame(np.random.random_sample((5, 3)), columns=['speed', 'endurance', 'strength'])
speed endurance strength
0 0.901001 0.531624 0.599738
1 0.302515 0.439233 0.143280
2 0.616964 0.984054 0.151714
3 0.681594 0.601456 0.655960
4 0.831605 0.742175 0.276892
因此,對于每一行,我可以根據分數列出主要、次要和三次屬性,其中df.to_numpy().argsort().
我需要總結每個屬性達到每個位置的次數,例如:
position speed endurance strength
primary 3 2 0
secondary 2 1 2
tertiary 0 2 3
(我手動計算了我的預期輸出,所以它可能有錯誤,但希望原理很清楚。)
我想我可以(np.argsort(arr)==0).sum()為每個人做到這一點,[0, 1, 2]但有沒有更簡單的方法?
uj5u.com熱心網友回復:
您可以使用rank和crosstab:
# names
d = {1:'primary',2:'secondary', 3:'tertiary'}
# ranks
s = df.rank(1, ascending=False).stack().map(d)
out = pd.crosstab(s, s.index.get_level_values(1)).rename_axis(index=None, columns=None)
輸出:
endurance speed strength
primary 2 3 0
secondary 1 2 2
tertiary 2 0 3
替代格式:
out = (pd.crosstab(s, s.index.get_level_values(1))
.rename_axis(index='position', columns=None).reset_index()
)
輸出:
position endurance speed strength
0 primary 2 3 0
1 secondary 1 2 2
2 tertiary 2 0 3
uj5u.com熱心網友回復:
您可以通過以下方式計算DataFrame從創建的argsort替換缺失值到0并rename使用更改順序或行索引值DataFrame.iloc:
d = {2:'primary',1:'secondary', 0:'tertiary'}
df = (pd.DataFrame(df.to_numpy().argsort(), columns=df.columns)
.apply(pd.value_counts)
.fillna(0)
.astype(int)
.iloc[::-1]
.rename(d))
print (df)
speed endurance strength
primary 3 2 0
secondary 2 1 2
tertiary 0 2 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481083.html
上一篇:根據另一個列計算列的總和
下一篇:內外印有什么區別
