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

1

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

     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
Теги:
pandas

2 ответа

2
Лучший ответ

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

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

     foo  bar
0  Alice   42
1  Alice   44
2

Способ 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню