Как подсчитать повторяющиеся строки в pandas dataframe?
Я пытаюсь подсчитать дубликаты каждого типа строк в моем фреймворке. Например, скажем, что у меня есть dataframe в pandas следующим образом:
df = pd.DataFrame({'one' : pd.Series([1., 1, 1]), 'two' : pd.Series([1., 2., 1] )})
Я получаю df, который выглядит так:
one two
0 1 1
1 1 2
2 1 1
Я предполагаю, что первый шаг - найти все разные уникальные строки, которые я делаю:
df.drop_duplicates()
Это дает мне следующий df:
one two
0 1 1
1 1 2
Теперь я хочу взять каждую строку из приведенных выше df ([1 1] и [1 2]) и подсчитать количество раз в каждом начальном df. Мой результат будет выглядеть примерно так:
Row Count
[1 1] 2
[1 2] 1
Как мне сделать этот последний шаг?
Edit:
Здесь приведен более подробный пример:
df = pd.DataFrame({'one' : pd.Series([True, True, True, False]), 'two' : pd.Series([True, False, False, True] ), 'three' : pd.Series([True, False, False, False] )})
дает мне:
one three two
0 True True True
1 True False False
2 True False False
3 False False True
Мне нужен результат, который говорит мне:
Row Count
[True True True] 1
[True False False] 2
[False False True] 1
Ответы
Ответ 1
Вы можете groupby
во всех столбцах и вызвать size
индекс указывает на повторяющиеся значения:
In [28]:
df.groupby(df.columns.tolist(),as_index=False).size()
Out[28]:
one three two
False False True 1
True False False 2
True True 1
dtype: int64
Ответ 2
Это то, что вам действительно нужно:
df = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'count'})
one two count
0 1 1 2
1 1 2 1
Ответ 3
df = pd.DataFrame({'one' : pd.Series([1., 1, 1, 3]), 'two' : pd.Series([1., 2., 1, 3] ), 'three' : pd.Series([1., 2., 1, 2] )})
df['str_list'] = df.apply(lambda row: ' '.join([str(int(val)) for val in row]), axis=1)
df1 = pd.DataFrame(df['str_list'].value_counts().values, index=df['str_list'].value_counts().index, columns=['Count'])
Выдает:
>>> df1
Count
1 1 1 2
3 2 3 1
1 2 2 1
Если значения индекса должны быть списком, вы можете сделать приведенный выше код еще одним шагом:
df1.index = df1.index.str.split()
Выдает:
Count
[1, 1, 1] 2
[3, 2, 3] 1
[1, 2, 2] 1
Ответ 4
Если вы хотите посчитать дубликаты в определенных столбцах:
len(df['one'])-len(df['one'].drop_duplicates())
Если вы хотите посчитать дубликаты на весь фрейм данных:
len(df)-len(df.drop_duplicates())
Или просто вы можете использовать DataFrame.duplicated(subset = None, keep = 'first'):
df.duplicated(subset='one', keep='first').sum()
где
подмножество: метка столбца или последовательность меток (по умолчанию используются все столбцы)
keep: {'first,' last, False}, default 'first
- first: помечать дубликаты как True, за исключением первого вхождения.
- last: помечать дубликаты как True, за исключением последнего вхождения.
- False: пометить все дубликаты как True.
Ответ 5
Ни один из существующих ответов не предлагает простого решения, которое возвращает "количество строк, которые являются только дубликатами и должны быть вырезаны". Это универсальное решение, которое:
# generate a table of those culprit rows which are duplicated:
dups = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'count'})
# sum the final col of that table, and subtract the number of culprits:
dups['count'].sum() - dups.shape[0]