Как получить самую частую строку в таблице

#python #pandas #numpy #frequency #mode

#python #панды #numpy #частота #режим

Вопрос:

Как получить самую частую строку в 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() помощью метода.

Ответ №1:

Проверьте 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. Альтернатива df.groupby(df.columns.tolist(), as_index=False).size().sort_values('size').tail(1).drop('size', 1)

Ответ №2:

С помощью 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
  

Если вы ищете производительность, преобразуйте столбец string в числовой, а затем используйте 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)
  

Ответ №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
  

Комментарии:

1. Вы должны проверить свой код. Как вы получаете 'size' столбец?

2. Вы правы, я добавил «as_index= False», который я почему-то опустил при его записи. Спасибо!

Ответ №4:

npi_indexed библиотека помогает выполнять некоторые действия над проблемами типа ‘groupby’ с меньшим количеством скриптов и такой же производительностью, как numpy . Итак, это альтернативный и очень похожий способ np.unique() решения на основе @Divakar:

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

Ответ №5:

В Pandas 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