Как создать новый DataFrame из Dataframe, исключая строки на основе количества вхождений в определенном столбце? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть следующий фрейм данных:

     foo  bar
0  Alice   42
1  Alice   44
2    Bob   22

и я пытаюсь получить новый фрейм данных, исключая последнюю строку, потому что Bob встречается только один раз в столбце foo

     foo  bar
0  Alice   42
1  Alice   44

Вот код, который я использую для создания фрейма данных, показанного выше:

df = pd.DataFrame(
    {
        "foo": ["Alice", "Alice", "Bob"],
        "bar": [42, 44, 22]
    }
)

и мой подход к этому требованию (который не работает ..)

col_foo_gt_1 = df["foo"].value_counts() > 1
print(col_foo_gt_1["Alice"])  # Prints true
print(col_foo_gt_1["Bob"])  # Prints false

df_bob_removed = pd.DataFrame(
    df[col_foo_gt_1[df["foo"]]]
)

Я получаю ошибку:

ValueError: cannot reindex from a duplicate axis

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Вот еще одно решение, использующее .transform:

df_bob_removed = df.loc[
    df.groupby('foo')['foo'].transform('count') > 1, 
]

     foo  bar
0  Alice   42
1  Alice   44
0 голосов
/ 23 июня 2018

Метод 1

Используйте groupby и filter:

df.groupby('foo').filter(lambda x: len(x) >1)

     foo  bar
0  Alice   42
1  Alice   44

Метод 2

Вы можете установить индекс на foo и затем использовать loc:

df.set_index('foo').loc[(df.foo.value_counts() >1)]

       bar
foo       
Alice   42
Alice   44

Если вы хотите сбросить индекс после этого:

df.set_index('foo').loc[(df.foo.value_counts() >1)].reset_index()
     foo  bar
0  Alice   42
1  Alice   44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...