我正在使用 python 3.x 我有熊貓資料框 df。df 看起來像
Name Maths Science Social studies
abc 80 70 90
cde 90 60 80
xyz 100 80 85
...
...
我想生成一個熊貓資料框,它將存盤學生姓名、最高分數和該科目貢獻的最高分數。如果最大分數是 100,那么它將考慮下一個最高分數而不是 100。所以我的輸出資料框看起來像
Name Highest_Marks Subject_contributed_Max
abc 90 Social Studies
cde 90 Maths
xyz 85 Social Studies
你能建議我怎么做嗎?
uj5u.com熱心網友回復:
您可以使用:
df2 = df.drop(columns='Name').mask(df.eq(100))
df['Highest_Marks'] = df2.max(axis=1)
df['Subject_contributed_Max'] = df2.idxmax(axis=1)
輸出:
Name Maths Science Social studies Highest_Marks Subject_contributed_Max
0 abc 80 70 90 90.0 Social studies
1 cde 90 60 80 90.0 Maths
2 xyz 100 80 85 85.0 Social studies
為了提高效率,避免計算兩倍的 max/idxmax,您可以計算idxmax并使用查找
s = (df
.drop(columns='Name')
.mask(df.eq(100))
.idxmax(axis=1)
)
idx, cols = pd.factorize(s)
df['Highest_Marks'] = df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]
df['Subject_contributed_Max'] = s
uj5u.com熱心網友回復:
這將起作用
df_melt = df.melt('Name')
df_melt = df_melt.loc[df_melt['value'] < 100]
df_melt['RN'] = df_melt.sort_values(['value'], ascending=False).groupby(['Name']).cumcount() 1
df_melt.loc[df_melt['RN'] == 1].sort_values('Name')
uj5u.com熱心網友回復:
這將做到:
df = df.set_index('Name').stack().reset_index().rename(columns={
'level_1':'Subject_contributed_Max', 0:'Highest_Marks'}).sort_values(
['Name','Highest_Marks'])
df = df[df['Highest_Marks'] != 100].groupby('Name').last().reset_index()[[
'Name', 'Highest_Marks', 'Subject_contributed_Max']]
輸入:
Name Maths Science Social studies
0 abc 80 70 90
1 cde 90 60 80
2 xyz 100 80 85
輸出:
Name Highest_Marks Subject_contributed_Max
0 abc 90 Social studies
1 cde 90 Maths
2 xyz 85 Social studies
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483174.html
下一篇:獲取機器人連接到的語音通道的ID
