对于每一行,获取最频繁值的频率

for each row get frequency of the most frequent value

我有一个看起来像这样的数据框:

var1  var2   var3  var4
a      a      a    b
c      c      b    d
e      e      f    g 
g      a      a    z
g      a      a    g
w      w      w    w

我想做的是为每一行确定最频繁的值并计算它出现的次数,在这种情况下我会得到

var1  var2   var3  var4  frq
a      a      a    b      3
c      c      b    d      2
e      e      f    g      2
g      a      a    z      2
g      a      a    g      2
w      w      w    w      4

我想使用 pd.get_dummies 之类的东西,但是会有太多的虚拟变量,因为每个 var1、var2 等可能会假设很多不同的值

在转置数据帧上尝试 pd.value_counts 以及 max() 函数:

df["frq"] = df.T.apply(pd.value_counts).max()

让我们试试

from scipy import stats
stats.mode(df.values.T)[1]
Out[143]: array([[3, 2, 2, 2, 2, 4]])
#df["frq"] =  stats.mode(df.values.T)[1][0]

另一种方法是使用 axis=1:

df['frq'] = df.apply(lambda x: x.value_counts().iloc[0], axis=1)

或使用stackgroupby:

df['frq'] = df.stack().groupby(level=0).value_counts().max(level=0)

你可以在这里使用df.mode。需要注意的一件事是 mode 查找是否存在多个值。

来自pandas-doc df.mode

The mode of a set of values is the value that appears most often. It can be multiple values.

df['frq'] = df.eq(df.mode(axis=1)[0], axis=0).sum(1)

 var1 var2 var3 var4  frq
0    a    a    a    b    3
1    c    c    b    d    2
2    e    e    f    g    2
3    g    a    a    z    2
4    g    a    a    g    2
5    w    w    w    w    4

这是一个示例。我使用 value_counts 并将其应用于所有行。我得到了所有变量的计数,然后我只选择最大值以获得您要查找的确切结果:

import pandas as pd

df = pd.DataFrame({'var1': ["a","c","e","g","g","w"],
                   'var2': ["a","c","e","a","a","w"],
                   'var3': ["a","b","f","a","a","w"],
                   'var4': ["b","d","g","z","g","w"]})

frequency = df.apply(pd.value_counts, axis=1).max(axis=1)

df["frq"] = frequency

print(df)