Сокращение нерепрезентативных данных в DataFrame - PullRequest
0 голосов
/ 28 сентября 2018

ребята, я иногда балуюсь пандами - но я не могу требовать глубоких знаний.Сегодня мне пришлось отфильтровать несколько строк из DataFrame на основе вхождения значения в определенный столбец.Например, в этом упрощенном примере

In [57]: table = pd.DataFrame([[2, 'a'], [3, 'b'], [2, 'c'], [4, 'd'], [4, 'e'], [5, 'f']], 
...:                      columns=('group', 'letter'))
...: print(table)
...:                      
   group letter
0      2      a
1      3      b
2      2      c
3      4      d
4      4      e
5      5      f

я хочу отфильтровать строки со значением в столбце group , которое появляется только один раз в DataFrame .

Я взломал проблему с помощью этого неуместного решения (опять же, это только пример)

In [58]: pd.concat(df for _, df in table.groupby(by=['group']) if len(df) > 1)
Out[58]: 
   group letter
0      2      a
2      2      c
3      4      d
4      4      e

Но я уверен, что есть правильные способы достижения той же цели.

Кто-нибудь может предложить более панда решение?!

Заранее спасибо

1 Ответ

0 голосов
/ 28 сентября 2018

Для лучшей производительности используйте GroupBy.transform для возврата Series с тем же размером, что и исходный df, поэтому возможна фильтрация по boolean indexing:

table = table[table.groupby(by=['group'])['letter'].transform('size') > 1]
print(table)
   group letter
0      2      a
2      2      c
3      4      d
4      4      e

Подробно :

print(table.groupby(by=['group'])['letter'].transform('size'))
0    2
1    1
2    2
3    2
4    2
5    1
Name: letter, dtype: int64

Другое решение с filter в большом DataFrame должно быть медленнее:

table = table.groupby(by=['group']).filter(lambda x: len(x) > 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...