gpt4 book ai didi

python - 如何从 Pandas 数据框中选择有序的分类列?

转载 作者:行者123 更新时间:2023-12-05 03:25:05 25 4
gpt4 key购买 nike

我有一个 pandas 数据框,其中包含无序和有序的分类列(以及其他数据类型的列)。我只想选择有序的分类列。

这是一个示例数据集:

import pandas as pd
import numpy.random as npr

n_obs = 20
eye_colors = ["blue", "brown"]
people = pd.DataFrame({
"eye_color": npr.choice(eye_colors, size=n_obs),
"age": npr.randint(20, 60, size=n_obs)
})
people["age_group"] = pd.cut(people["age"], [20, 30, 40, 50, 60], right=False)
people["eye_color"] = pd.Categorical(people["eye_color"], eye_colors)

这里,eye_color 是无序分类列,age_group 是有序分类列,age 是数字。我只想要 age_group 列。

我可以使用 .select_dtypes() 选择所有分类列。

categories = people.select_dtypes("category")

我可以使用带有 .cat.ordered 属性的列表理解,然后将其限制为仅排序的类别。

categories[[col for col in categories.columns if categories[col].cat.ordered]]

这是非常复杂的代码,所以感觉必须有更好的方法。

从数据框中仅选择有序列的惯用方法是什么?

最佳答案

您可以直接遍历数据类型并返回一个 bool 值掩码,以避免在您准备好子集化之前不必要地复制底层数据:

>>> categorical_ordered = [isinstance(d, pd.CategoricalDtype) and d.ordered for d in people.dtypes]

>>> people.loc[:, categorical_ordered].head()
age_group
0 [30, 40)
1 [20, 30)
2 [50, 60)
3 [30, 40)
4 [20, 30)

您还可以按照@richardec 在评论中的建议使用is_categorical_dtype,或者简单地与dtype 的字符串表示形式进行比较。

>>> from pandas.api.types import is_categorical_dtype
>>> [isinstance(d, pd.CategoricalDtype) and d.ordered for d in people.dtypes]
[False, False, True]

>>> [is_categorical_dtype(d) and d.ordered for d in people.dtypes]
[False, False, True]

>>> [d == 'category' and d.ordered for d in people.dtypes]
[False, False, True]

您还可以使用 .apply 抽象出 for-loop

>>> people.dtypes.apply(lambda d: d == 'category' and d.ordered)
eye_color False
age False
age_group True
dtype: bool

>>> people.loc[:, people.dtypes.apply(lambda d: d == 'category' and d.ordered)]
age_group
0 [20, 30)
1 [40, 50)
2 [20, 30)
3 [40, 50)
...

关于python - 如何从 Pandas 数据框中选择有序的分类列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72116379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com