首页Python【Python数据分析】3...

【Python数据分析】38.数据清洗与准备——分类数据2


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

1.分类计算:

与非编码版本(如字符串数组)相比,在 Pandas 中使用 Categorical 与其操作一样。Pandas 的某些部分,如 groupby 函数,在处理分类时会表现更好。还有一些函数可以利用ordered 标志。

下面实例中,首先生成一些随机数字数据并使用 pandas.qcut 分箱函数。这将返回pandas.Categorical;我们在前面使用了  pandas.qcut ,但忽略了分类如何工作的细节。

1>>> rng = np.random.default_rng(seed=12345)
2
3>>> draws = rng.standard_normal(1000)
4
5>>> bins = pd.qcut(draws, 4)
6>>> bins
7[(-3.121, -0.675], (0.6873.211], (-3.121, -0.675], (-0.6750.0134], (-0.6750.0134], ..., (0.01340.687], (0.01340.687], (-0.6750.0134], (0.01340.687], (-0.6750.0134]]
8Length: 1000
9Categories (4, interval[float64, right]): [(-3.121, -0.675] < (-0.6750.0134] < (0.01340.687] < (0.6873.211]]

通过 labels 参数对分组命名。

 1>>> bins = pd.qcut(draws, 4, labels=['Q1''Q2''Q3''Q4'])
2>>> bins
3['Q1''Q4''Q1''Q2''Q2', ..., 'Q3''Q3''Q2''Q3''Q2']
4Length: 1000
5Categories (4, object): ['Q1' < 'Q2' < 'Q3' < 'Q4']
6
7>>> bins.codes[:10]
8array([0301100220], dtype=int8)
9
10>>> bins.categories
11Index(['Q1''Q2''Q3''Q4'], dtype='object')

带标签的 bins 分类数据并不包含有关数据中 箱体边界的信息,因此我们可以使用 groupby来提取一些汇总统计信息。

1>>> bins = pd.Series(bins, name='quartile')
2
3>>> result = pd.Series(draws).groupby(bins).agg(['count''min''max']).reset_index()
4>>> result

结果中的‘quartile’列保留了原始分类信息,包括来自箱子的排序。

1>>> result['quartile']
20    Q1
31    Q2
42    Q3
53    Q4
6Name: quartile, dtype: category
7Categories (4, object): ['Q1' < 'Q2' < 'Q3' < 'Q4']

2.分类方法:

包含分类数据的Series 有几个类似于 Series.str 专用字符串方法,也提供了对类别(categories )和代码(codes)的快捷访问方式。

 1>>> s = pd.Series(['a''b''c''d'] * 2)
2>>> s
30    a
41    b
52    c
63    d
74    a
85    b
96    c
107    d
11dtype: object
12
13>>> cat_s = s.astype('category')
14>>> cat_s
150    a
161    b
172    c
183    d
194    a
205    b
216    c
227    d
23dtype: category
24Categories (4, object): ['a''b''c''d']

特殊属性 cat提供了对分类方法的访问。

 1>>> cat_s.cat.codes
20    0
31    1
42    2
53    3
64    0
75    1
86    2
97    3
10dtypeint8

假设我们知道该数据的实际类别集合超出了数据中观察到的四个值。我们可以使用 set_categories方法来改变它们。

 1>>> actual_categories = ['a''b''c''d''e']
2>>> cat_s2 = cat_s.cat.set_categories(actual_categories)
3>>> cat_s2
40    a
51    b
62    c
73    d
84    a
95    b
106    c
117    d
12dtype: category
13Categories (5, object): ['a''b''c''d''e']

虽然看起来数据没有变化,但新类别将反映在使用它们的操作中。例如,value_counts  结果。

 1>>> cat_s.value_counts()
2a    2
3b    2
4c    2
5d    2
6dtype: int64
7
8>>> cat_s2.value_counts()
9a    2
10b    2
11c    2
12d    2
13e    0
14dtype: int64

在大型数据集中,分类通常用作节省内存和提高性能的便捷工具。在过滤大型 DataFrame 或 Series 后,许多类别可能不会出现在数据中。为了解决这个问题,我们可以使用 remove_unused_categories 方法来去除未观察到的类别。

 1>>> cat_s3 = cat_s[cat_s.isin(['a''b'])]
2>>> cat_s3
30    a
41    b
54    a
65    b
7dtype: category
8Categories (4, object): ['a''b''c''d']
9
10>>> cat_s3.cat.remove_unused_categories()
110    a
121    b
134    a
145    b
15dtype: category
16Categories (2, object): ['a''b']

Pandas中Series 中的分类方法:

方法 说明
add_categories 在现有类别的末尾添加新的(未使用的)类别
as_ordered 对类别排序
as_unordered 使类别无序
remove_categories 删除类别,将被删除的值设置为null
remove_unused_categories 删除未出现在数据中的所有类别值
rename_categories
用一组新类别名称替换现有类别;不会更改类别的数量
reorder_categories 行为类似于 rename_categories,但结果是经过排序的类别
set_categories 用一组新类别替换现有类别;可以添加或删除类别


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments