为熊猫数据框的每一行创建一个包含最大频率值列表的新列

时间:2021-01-30 19:01:19

标签: python-3.x pandas dataframe max frequency

鉴于此数据框:

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 个新闻栏,为每一行提供 ma​​x_freqma​​x_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

编辑:根据 @rhug123 给出的答案,我编辑了我的代码。

感谢大家的回答。

3 个答案:

答案 0 :(得分:1)

我们可以尝试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

答案 1 :(得分:1)

试试这个,它使用 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))

答案 2 :(得分:0)

也许你可以使用这个功能:

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

希望有帮助:)