У меня есть следующий фрейм данных:
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
Здесь другое решение, использующее .transform
:
df_bob_removed = df.loc[
df.groupby('foo')['foo'].transform('count') > 1,
]
foo bar
0 Alice 42
1 Alice 44
Способ 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