удалить группу по номеру вхождения - PullRequest
0 голосов
/ 25 ноября 2018

Привет! Я хочу удалить строки с записями, число вхождений которых меньше числа, например:

df = pd.DataFrame({'a': [1,2,3,2], 'b':[4,5,6,7], 'c':[0,1,3,2]})
df
   a  b  c
0  1  4  0
1  2  5  1
2  3  6  3
3  2  7  2

Здесь я хочу удалить все строки, если числовхождение в столбце «а» менее чем в два раза.
Требуемый вывод:

   a  b  c
1  2  5  1
3  2  7  2

Что я знаю: мы можем найти число вхождений по condition = df['a'].value_counts() < 2, и это даст мне что-то вроде:

2    False
3    True
1    True
Name: a, dtype: int64

Но я не знаю, как мне подойти отсюда, чтобы удалить строки.
Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 25 ноября 2018

Вы можете попробовать что-то вроде этого, чтобы получить длину каждой группы, преобразовать обратно в исходный индекс и индексировать df по нему

df[df.groupby("a").transform(len)["b"] >= 2]


    a   b   c
1   2   5   1
3   2   7   2

Разбив его на отдельные шаги, вы получите:

df.groupby("a").transform(len)["b"]

0    1
1    2
2    1
3    2
Name: b, dtype: int64

Это размеры групп, преобразованные обратно в ваш исходный индекс

df.groupby("a").transform(len)["b"] >=2

0    False
1     True
2    False
3     True
Name: b, dtype: bool

Затем мы превращаем это в логический индекс и индексируем наш оригинальный фрейм данных по нему

0 голосов
/ 25 ноября 2018

groupby + size

res = df[df.groupby('a')['b'].transform('size') >= 2]

Метод transform отображает df.groupby('a')['b'].size() в dfвыравнивается с df['a'].

value_counts + map

s = df['a'].value_counts()
res = df[df['a'].map(s) >= 2]

print(res)

   a  b  c
1  2  5  1
3  2  7  2
0 голосов
/ 25 ноября 2018

Вы можете использовать df.where и dropna

df.where(df['a'].value_counts() <2).dropna()

     a   b   c
1   2.0 5.0 1.0
3   2.0 7.0 2.0
...