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

【Python数据分析】34.数据清洗与准备——数据转换3


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

  • 可以在以下网站查看,该网站是使用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.置换和随机抽样:

使用 numpy.random.permutation 函数可以排列(随机重新排序)一个Series 或 DataFrame 中的行。

在调用 permutation 的时候,根据你想要的轴长度生成一个表示新排序的整数数组。

 1>>> data = pd.DataFrame(np.arange(24).reshape(6,4))
2>>> data
3    0   1   2   3
40   0   1   2   3
51   4   5   6   7
62   8   9  10  11
73  12  13  14  15
84  16  17  18  19
95  20  21  22  23
10
11>>> sampler = np.random.permutation(6)
12>>> sampler
13array([423501])

然后可以在基于iloc 索引或等价的 take 函数中使用该数组。

 1>>> data.iloc[sampler]
2    0   1   2   3
34  16  17  18  19
42   8   9  10  11
53  12  13  14  15
65  20  21  22  23
70   0   1   2   3
81   4   5   6   7
9
10>>> data.take(sampler)
11    0   1   2   3
124  16  17  18  19
132   8   9  10  11
143  12  13  14  15
155  20  21  22  23
160   0   1   2   3
171   4   5   6   7

通过使用 axis="columns" 调用 take 函数可以选择列的排列:

 1>>> sampler = np.random.permutation(4)
2>>> sampler
3array([3021])
4
5>>> data.take(sampler,axis="columns")
6    3   0   2   1
70   3   0   2   1
81   7   4   6   5
92  11   8  10   9
103  15  12  14  13
114  19  16  18  17
125  23  20  22  21

要选择不放回的随机子集(同一行不能出现两次),可以在 Series 和 DataFrame 上使用 sample 方法。

1>>> data.sample(3)
2    0   1   2   3
30   0   1   2   3
43  12  13  14  15
51   4   5   6   7

要生成带有替代值的样本(允许有重复选择),需要将 replace=True 传入 sample 方法。

1>>> data.sample(6,replace=True)
2    0   1   2   3
32   8   9  10  11
41   4   5   6   7
54  16  17  18  19
64  16  17  18  19
70   0   1   2   3
85  20  21  22  23

2.计算指标/虚拟变量

统计建模或机器学习应用中的一种类型的转换是将分类变量转换为虚拟或指标矩阵。

2.1 DataFrame 中一行只属于一个类别:

如果 DataFrame 中的一列有 k 个不同的值,将生成一个k列的值为1或0的矩阵或DataFrame 。 

Pandas 有一个 pandas.get_dummies 函数来执行此操作。

让我们考虑一个DataFrame示例 :

 1>>> df = pd.DataFrame({"key": ["b""b""a""c""a""b"],"value": [11,22,33,44,55,66]})
2>>> df
3  key  value
40   b     11
51   b     22
62   a     33
73   c     44
84   a     55
95   b     66
10
11>>> pd.get_dummies(df["key"])
12   a  b  c
130  0  1  0
141  0  1  0
152  1  0  0
163  0  0  1
174  1  0  0
185  0  1  0

在某些情况下,你可能希望在指标 DataFrame 中的列上添加前缀, pandas.get_dummies 有一个用于执行此操作的前缀参数prefix

1>>> dummies = pd.get_dummies(df["key"],prefix="KEY")
2>>> dummies
3   KEY_a  KEY_b  KEY_c
40      0      1      0
51      0      1      0
62      1      0      0
73      0      0      1
84      1      0      0
95      0      1      0

然后通过 DataFrame.join 方法将其与其他数据合并。

1>>> df_with_dummy = df[["value"]].join(dummies)
2>>> df_with_dummy
3   value  KEY_a  KEY_b  KEY_c
40     11      0      1      0
51     22      0      1      0
62     33      1      0      0
73     44      0      0      1
84     55      1      0      0
95     66      0      1      0

2.2 DataFrame 中的一行属于多个类别

如果 DataFrame 中的一行属于多个类别,我们必须使用不同的方法来创建虚拟变量。

1>>> df = pd.DataFrame({"key": ["b|c""a|b|c""a""a|c""b|d""c|e"],"value": [11,22,33,44,55,66]})
2>>> df
3     key  value
40    b|c     11
5
1  a|b|c     22
6
2      a     33
7
3    a|c     44
84    b|d     55
9
   c|e     66

Pandas 实现了一个特殊的 Series 方法 str.get_dummies(以 str. 开头的方法将在后面的字符串操作中进行更详细的讨论)来处理这种通过分隔字符串编码的情况。

1>>> dummies = df["key"].str.get_dummies("|")
2>>> dummies
3   a  b  c  d  e
40  0  1  1  0  0
51  1  1  1  0  0
62  1  0  0  0  0
73  1  0  1  0  0
84  0  1  0  1  0
95  0  0  1  0  1

然后,可以通过 DataFrame.join 方法将其与其他数据合并,并使用add_prefix  方法将前缀添加到虚拟变量 DataFrame 中的列名中。

1>>> df_with_dummy = df.join(dummies.add_prefix("KEY_"))
2>>> df_with_dummy
3     key  value  KEY_a  KEY_b  KEY_c  KEY_d  KEY_e
40    b|c     11      0      1      1      0      0
51  a|
b|c     22      1      1      1      0      0
62      a     33      1      0      0      0      0
73    a|
c     44      1      0      1      0      0
84    b|d     55      0      1      0      1      0
95    c|
e     66      0      0      1      0      1

2.3 pandas.get_dummies + pandas.cut

统计应用程序的一个有用方法是将 pandas.get_dummies 与像 pandas.cut这样的离散化函数结合起来。

 1>>> value = np.random.uniform(size=10)
2>>> value
3array([0.254848810.426721660.755410750.804835370.73278982,
4       0.351953320.681009080.268544810.302203730.06221511])
5
6>>> bins = [0 ,0.2 ,0.4 , 0.6 ,0.8 ,1]
7
8>>> pd.cut(value , bins)
9[(0.20.4], (0.40.6], (0.60.8], (0.81.0], (0.60.8], (0.20.4], (0.60.8], (0.20.4], (0.20.4], (0.00.2]]
10Categories (5, interval[float64, right]): [(0.00.2] < (0.20.4] < (0.40.6] < (0.60.8] < (0.81.0]]
11
12>>> pd.get_dummies(pd.cut(value , bins))


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments