Подсчет if (COUNTIF) и добавление к фрейму данных в Python - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть датафрейм с большим количеством дубликатов.Я нашел много решений, чтобы найти количество дубликатов, но не так, как я хотел.Есть ли способ подсчитать дубликаты в новом столбце, если он содержит меньше или равно 2 дубликатам?

Кадр данных выглядит так:

    NAME
0  Peter
1  Peter
2  Peter
3   Jack
4   Jack
5   Luke

Но я хочу, чтобы он выгляделкак это:

    NAME  Count
0  Peter      0
1  Peter      0
2  Peter      0
3   Jack      1
4   Jack      1
5   Luke      1

И затем отфильтруйте его (удалите строки) так, чтобы у меня был только кадр данных, где Count равен 1.

    NAME  Count
0   Jack      1
1   Jack      1
2   Luke      1

Если есть более простойспособ удалить дубликаты, то я рад услышать об этом.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019
import pandas as pd
import numpy as np

data = '''\
Name
Peter
Peter
Peter
Jack
Luke'''

df = pd.read_csv(pd.compat.StringIO(data), sep=',')     # Recreating dataframe
print(any(df['Name'].duplicated()))                     # Prints True
df['Count'] = (df.groupby('Name')['Name'].transform('size') <= 2).astype(int)

print(df)

# To print only the ones without `0`

df = df[df['Count'] != 0]
print(df)

ВЫХОД:

True                    
    Name  Count
0  Peter      0
1  Peter      0
2  Peter      0
3   Jack      1
4   Luke      1
   Name  Count
3  Jack      1
4  Luke      1
0 голосов
/ 13 февраля 2019

Используйте GroupBy.transform с size для подсчета до нового столбца, а затем отфильтруйте по boolean indexing:

df['count'] = df.groupby('NAME')['NAME'].transform('size')
df = df[df['count'] <= 2]

print (df)
   NAME  count
3  Jack      2
4  Jack      2
5  Luke      1

Если необходимо преобразовать столбец индикаторабулево масно-целое число для True,False на 1,0 сопоставления:

df['count'] = (df.groupby('NAME')['NAME'].transform('size') <= 2).astype(int)
df = df[df['count'] != 0]

print (df)
   NAME  count
3  Jack      1
4  Jack      1
5  Luke      1

Альтернативное решение с map и value_counts:

df['count'] = (df['NAME'].map(df['NAME'].value_counts()) <= 2).astype(int)
df = df[df['count'] != 0]
...