Питання Як підрахувати дубльовані рядки на панелі даних панди?


Я намагаюся підрахувати дублікати кожного типу рядків у моєму кадрі даних. Наприклад, скажіть, що у мене є патч даних в парах:

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

Як мені зробити це на останньому кроці?

Редагувати:

Ось більший приклад, щоб зробити це більш чітким:

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

13
2018-02-23 17:21


походження


чи можете ви перевірити, чи це працює: df.groupby(df.columns.tolist(),as_index=False).size() - EdChum
Це близько, але має відсутні значення. Я додав своє запитання, щоб я міг форматувати відповідь. - jss367
Це демонстраційна річ, вона інформує вас, де ці значення однакові для певного рівня - EdChum
А, бачу! Дуже дякую. Якщо ви хочете подати це як відповідь, я перевіряю це правильно. - jss367


Відповіді:


Ти можеш 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

18
2018-02-23 17:51



Я не впевнений, що правильно це розумію. Схоже, що я вказую число 1 в другому стовпчику (2) як його першу рядок [2 2], а потім номер 2 в другому стовпчику (1) як другий рядок [1 1]. Я шукаю кількість рядків, які [1 1] та [1 2]. У цьому випадку вони стають однаковими, але не в загальному випадку. Чи я щось не вистачає? - jss367
Цей випадок не працює, якщо ви маєте справу з відсутніми значеннями (як np.NaN), оскільки вони просто ігноруються groupby. - pansen
@pansen OP не вказав це як частину своїх вимог, також як слід np.NaN будь-що лікувати, оскільки у них відсутні значення? - EdChum
Ви маєте рацію - це не було вказано ОП. np.NaN слід розглядати як будь-яке інше дійсне значення, оскільки дубльовані рядки існують (і підраховуються) незалежно від наявності np.NaN чи ні. - pansen
@pansen де це зазначено що NaN  повинен слід розглядати як дійсне значення, якщо воно має відсутні дані та недійсне? Де це вважається нормою? - EdChum


Це те, що вам дійсно потрібно:

df = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'count'})

   one  two  count
0    1    1      2
1    1    2      1

9
2017-12-21 18:21





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

2
2018-02-23 18:55