我有幾個不同長度和行數的 DF。比如這樣:
df =
c1 c2 c3 c4
r1 8 4 5 2
r2 2 5 9 2
我需要遍歷每一列并回傳具有最高值的行,并將其作為鍵添加到以列名作為值的字典中。因此,對于 c1,我將 r1 作為鍵,c1 作為值,對于 c2,我將 r2 作為鍵,c2 作為值。然后對于 c3 我將 r2 作為鍵,現在 [c2,c3] 作為鍵。此外,對于 c4,我需要所有鍵才能將 c4 作為值添加到它們的串列中。
我正在處理的資料框有更多的列和更多的行。
最終的字典應該如下所示:
dict = {"r1": ["c1","c4"], "r2": ["c2","c3","c4"]}
起初這似乎并不難,但我很卡住。
我遇到的最困難的問題是將串列/值與每個鍵分開。
任何幫助將不勝感激!
uj5u.com熱心網友回復:
IIUC,您可以將每個值與max每列進行比較,然后只保留最大值并重塑為字典:
s = df.eq(df.max()).stack()
s[s].reset_index(level=1).groupby(level=0)['level_1'].agg(list).to_dict()
輸出:{'r1': ['c1', 'c4'], 'r2': ['c2', 'c3', 'c4']}
groupby利用索引回傳字典這一事實的替代方法:
s = df.eq(df.max()).stack()
s = s[s].reset_index(level=0)['level_0']
out = s.index.groupby(s)
# {'r1': ['c1', 'c4'], 'r2': ['c2', 'c3', 'c4']}
uj5u.com熱心網友回復:
讓我們嘗試rank
d = df.rank(ascending=False,method = 'dense').apply(lambda x: x.index[x==1].tolist(),axis=1).to_dict()
Out[52]: {'r1': ['c1', 'c4'], 'r2': ['c2', 'c3', 'c4']}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443617.html
