#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