如何获得表中最频繁的行

时间:2020-09-28 14:38:27

标签: python pandas numpy frequency mode

如何获取DataFrame中最频繁的行? 例如,如果我有下表:

   col_1  col_2 col_3
0      1      1     A
1      1      0     A
2      0      1     A
3      1      1     A
4      1      0     B
5      1      0     C

预期结果:

   col_1  col_2 col_3
0      1      1     A

编辑:我需要使用mode()方法可以计算出的最频繁的行(作为一个单位),而不是最频繁的列值。

5 个答案:

答案 0 :(得分:11)

选中groupby

df.groupby(df.columns.tolist()).size().sort_values().tail(1).reset_index().drop(0,1)
   col_1  col_2 col_3  
0      1      1     A  

答案 1 :(得分:9)

使用NumPy的np.unique-

In [92]: u,idx,c = np.unique(df.values.astype(str), axis=0, return_index=True, return_counts=True)

In [99]: df.iloc[[idx[c.argmax()]]]
Out[99]: 
   col_1  col_2 col_3
0      1      1     A

如果您要寻找性能,请将字符串列转换为数字,然后使用np.unique-

a = np.c_[df.col_1, df.col_2, pd.factorize(df.col_3)[0]]
u,idx,c = np.unique(a, axis=0, return_index=True, return_counts=True)

答案 2 :(得分:3)

您可以使用groupby和size执行此操作:

df = df.groupby(df.columns.tolist(),as_index=False).size()
result = df.iloc[[df["size"].idxmax()]].drop(["size"], axis=1)
result.reset_index(drop=True) #this is just to reset the index

答案 3 :(得分:2)

npi_indexed库有助于以“更少”的脚本和类似于numpy的性能对“ groupby”类型的问题执行某些操作。因此,这是@Divakar基于np.unique()的解决方案的替代方式,并且非常相似:

arr = df.values.astype(str)
idx = npi.multiplicity(arr)
output = df.iloc[[idx[c.argmax()]]]

答案 4 :(得分:1)

在熊猫1.1.0中。可以使用方法value_counts()对DataFrame中的唯一行进行计数:

df.value_counts()

输出:

col_1  col_2  col_3
1      1      A        2
       0      C        1
              B        1
              A        1
0      1      A        1

此方法可用于查找最频繁的行:

df.value_counts().head(1).index.to_frame(index=False)

输出:

   col_1  col_2 col_3
0      1      1     A