Отфильтруйте pag catagorical dataframe по значениям столбца, затем обновите его категории - PullRequest
2 голосов
/ 27 марта 2020

Я начинаю с катагорических данных панда.

Допустим, у меня есть (1) :

A    B     C
-------------
3    Z     M
O    X     T
4    A     B

Я отфильтровал кадр данных так: df[ df['B'] != "X"] Таким образом, я получил бы в результате (2 ) :

A    B     C
-------------
3    Z     M
4    A     B

In (1) df['B'].cat.categories #would equal to ['Z', 'X', 'A']

In (2) df['B'].cat.categories #still equal to ['Z', 'X', 'A']

Как обновить категории DF всех столбцов после такой операции фильтрации?

БОНУС : если вы хотите очистить индексы после фильтрации

df.reset_index()

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

remove_unused_categories из столбцов после фильтрации.

Как указывает piRSquared, вы можете сделать это кратко, учитывая, что каждый столбец является категоричным dtype:

df = df.query('B != "X"').apply(lambda s: s.cat.remove_unused_categories())

Это проходит по столбцам после фильтрации.

print(df)
#   A  B  C
#0  3  Z  M
#1  O  X  T
#2  4  A  B

df['B'].cat.categories
#Index(['A', 'X', 'Z'], dtype='object')

df = df[ df['B'] != 'X']

# Update all category columns
for col in df.dtypes.loc[lambda x: x == 'category'].index:
    df[col] = df[col].cat.remove_unused_categories()

df['B'].cat.categories
#Index(['A', 'Z'], dtype='object')

df['C'].cat.categories
#Index(['B', 'M'], dtype='object')
1 голос
/ 27 марта 2020

Pandas храните категории отдельно и не удаляйте их, если они не используются, если вы хотите это сделать, вы можете использовать этот атрибут: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.cat.remove_unused_categories.html#pandas .Series.cat.remove_unused_categories

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...