[英]Getting list of all columns corresponding to maximum value in each row in a Dataframe
如何獲取與Dataframe中每一行中最大值對應的所有列的列表? 例如,如果我有這個數據框,
df = pd.DataFrame({'a':[12,34,98,26],'b':[12,87,98,12],'c':[11,23,43,1]})
a b c
0 12 12 11
1 34 87 23
2 98 98 43
3 26 12 1
我想制作另一個數據框,如下所示,
0 [a,b]
1 [b]
2 [a,b]
3 [a]
我怎樣才能做到這一點?
您可以嘗試這些代碼(機器人方法也一樣):
max_cols_df = pd.DataFrame({"max_cols": [list(df[df==mv].iloc[i].dropna().index) for i, mv in enumerate(df.max(axis=1))]})
max_cols_df = pd.DataFrame({"max_cols": [list(df.iloc[i][v].index) for i, v in df.eq(df.max(axis=1), axis=0).iterrows()]})
max_cols_df
----------------
max_cols
0 [a, b]
1 [b]
2 [a, b]
3 [a]
----------------
但是我認為您在另一篇文章中提出了相關問題,並且無法升級pandas
。 因此,第二個可能會引發錯誤。
使用Pandas Melt解決
import pandas as pd
df = pd.DataFrame({'a':[12,34,98,26],'b':[12,87,98,12],'c':[11,23,43,1]})
df = df.reset_index()
df = pd.melt(df, id_vars=['index'],value_vars=['a','b','c'], var_name='col_name')
df['Index_Value_Max'] = df.groupby(['index'])['value'].transform('max')
df[df['value'] == df['Index_Value_Max']].groupby(['index']).agg({'col_name':'unique'}).reset_index()
輸出:
首先,獲取每一行的最大值:
df.max(axis=1)
然后檢查數據框的值是否等於最大值。
df.eq(df.max(axis=1), axis=0)
然后逐行應用函數來選擇行中值為True
的列名。
df.apply(
lambda row: [k for k, v in row.iteritems() if v],
axis=1
)
概括地說,這是:
df.eq(df.max(axis=1), axis=0).apply(
lambda row: [k for k, v in row.iteritems() if v],
axis=1
)
0 [a, b]
1 [b]
2 [a, b]
3 [a]
dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.