Как подсчитать повторяющиеся строки в 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]