为Pandas Dataframe 的每一行创建一个包含最大频率值列表的新列

a0x5cqrl  于 2023-01-01  发布在  其他
关注(0)|答案(3)|浏览(110)

给定此 Dataframe :

df2 = pd.DataFrame([[3,3,3,3,3,3,5,5,5,5],[2,2,2,2,8,8,8,8,6,6]], columns=list('ABCDEFGHIJ'))

   A  B  C  D  E  F  G  H  I  J
0  3  3  3  3  3  3  5  5  5  5
1  2  2  2  2  8  8  8  8  6  6

我创建了2个新闻列,为每一行给予max_freqmax_freq_value

df2["max_freq_val"] = df2.apply(lambda x: x.mode().agg(list), axis=1)
df2["max_freq"] = df2.loc[:, df2.columns != "max_freq_val"].apply(lambda x: x.value_counts().max(), axis=1)

   A  B  C  D  E  F  G  H  I  J max_freq_val  max_freq
0  3  3  3  3  3  3  5  5  5  5          [3]         6
1  2  2  2  2  8  8  8  8  6  6       [2, 8]         4

EDIT:我已经编辑了我的代码,灵感来自**@rhug123**给出的答案。

感谢你们所有人的回答。

2exbekwf

2exbekwf1#

试试这个,它使用mode()

df2.assign(max_freq=pd.Series(df2.mode(axis=1).stack().groupby(level=0).agg(list)),
max_freq_value = df2.eq(df2.mode(axis=1)[0].squeeze(),axis=0).sum(axis=1))

df2.assign(freq = df2.eq((s := df2.mode(axis=1).stack().groupby(level=0).agg(list)).str[0],axis=0).sum(axis=1),val = s)
ui7jx7zq

ui7jx7zq2#

我们可以尝试stack,然后使用agg调整频率,将倍数输入list

s = df2.stack().groupby(level=0).value_counts()
s = s[s.eq(s.max(level=0),level=0)].reset_index(level=1).groupby(level=0).agg(val= ('level_1',list),fre=(0,'first'))
df2 = df2.join(s)
df2
Out[156]: 
   A  B  C  D  E  F  G  H  I  J     val  fre
0  3  3  3  3  3  3  5  5  5  5     [3]    6
1  2  2  2  2  8  8  8  8  6  6  [2, 8]    4
nhaq1z21

nhaq1z213#

也许你可以使用这个函数:

def give_back_maximums(a = [2,2,2,2,8,8,8,8,6,6]):
    values, counts = np.unique(a, return_counts=True)
    return values[counts >= counts.max()].tolist()

以下各项的顺序可能会影响结果

df2["max_freq_value"] =  df2.apply(lambda x: give_back_maximums(x), axis=1)
df2["max_freq"] = df2.apply(lambda x: x.value_counts().max(), axis=1)
print(df2)
   A  B  C  D  E  F  G  H  I  J max_freq_value  max_freq
0  3  3  3  3  3  3  5  5  5  5            [3]         6
1  2  2  2  2  8  8  8  8  6  6         [2, 8]         4

希望能有所帮助:)

相关问题