文章数据
收藏(次)

【python数据分析】第十二章 pandas高级应用-2

加关注
用分类提高性能
--------------------------------------------------------------------------------
如果你是在一个特定数据集上做大量分析,将其转换为分类可以极大地提高效率
GroupBy使用分类操作明显更快,是因为底层的算法使用整数编码数组,而不是字符串数组
xxxxx.astype('category') 转成这个类型即可了
--------------------------------------------------------------------------------
分类方法
--------------------------------------------------------------------------------
s = pd.Series(['a', 'b', 'c', 'd'] * 2)
cat_s = s.astype('category')
cat_s: 输出,现在是 category 类型了
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
dtype: category
Categories (4, object): [a, b, c, d]
--------------------------------------------------------------------------------
cat_s.cat

这个是内置的 pandas.core.arrays.categorical.CategoricalAccessor 类型对象
通过这个对象可以方便的访问内部的数据
cat_s.cat.codes 访问对应关系
cat_s.cat.categories 访问类型名称
--------------------------------------------------------------------------------
现在 cat_s 里面有 a b c d 四个类型,现在不够用了修改一下,扩展一个类型
cat_s2 = cat_s.cat.set_categories(['a', 'b', 'c', 'd', 'e'])
cat_s2 输出:
0 a
1 b
2 c
3 d
4 a
5 b
6 c
7 d
dtype: category
Categories (5, object): [a, b, c, d, e]
原来八个数据都还在,只是扩展了一个类型,新类型现在还没数据应用而已
--------------------------------------------------------------------------------
如果把原来的类型删除一个会怎么样:
cat_s2 = cat_s.cat.set_categories(['a', 'b', 'd', 'e'])
cat_s2 输出: 被删除的类型,如果有人引用,现在变成了 NA
0 a
1 b
2 NaN
3 d
4 a
5 b
6 NaN
7 d
dtype: category
Categories (4, object): [a, b, d, e]
--------------------------------------------------------------------------------
上面使用 set_categories 的方式把一个 category 删除了,但是映射关系还存在,变成了NA
能不能把映射关系也删除啊。

cat_s.isin(['a', 'b'])
输出:
0 True
1 True
2 False
3 False
4 True
5 True
6 False
7 False
dtype: bool

先删除映射关系,让没有数据应用那个索引,比如,现在只保留 a, b, 其他的不要了
cat_s3 = cat_s[cat_s.isin(['a', 'b'])]
cat_s3 输出:
0 a
1 b
4 a
5 b
dtype: category
Categories (4, object): [a, b, c, d]

# 删除无人引用的 category 即可
cat_s3.cat.remove_unused_categories()
输出:
0 a
1 b
4 a
5 b
dtype: category
Categories (2, object): [a, b]
--------------------------------------------------------------------------------
cat_s.cat.xxx 其他方法:
add_categories 在已存在的分类后面添加新分类
as_ordered 使分类有序
as_unordered 使分类无序
remove_categories 移除分类,引用了分类的数据为NA
remove_unused_categories 移除没人引用的分类
rename_categories 重命名,不能改变分类的数量
reorder_catgories 重排序
set_categories 新分类替代旧的,
--------------------------------------------------------------------------------
为建模创建虚拟变量

cat_s = pd.Series(['a', 'b', 'c', 'd'] * 2, dtype='category')
pd.get_dummies(cat_s) # 数据建模
# get_dummies 文档: Convert categorical variable into dummy/indicator variables.
哑变量 ???
================================================================================
GroupBy高级应用
--------------------------------------------------------------------------------
df = pd.DataFrame({'key': ['a', 'b', 'c'] * 4, 'value': np.arange(12.)})
df 输出:
key value
0 a 0.0
1 b 1.0
2 c 2.0
3 a 3.0
4 b 4.0
5 c 5.0
6 a 6.0
7 b 7.0
8 c 8.0
9 a 9.0
10 b 10.0
11 c 11.0

df.groupby('key').mean()
输出:
value
key
a 4.5
b 5.5
c 6.5

现在有个要求,获取一个 df 同型的数据,但是 values 值要变成 key 分组 的每组 平均值
比如 现在 a 分组有三个数据,计算平均,把 平均值替换掉原来的三个值。组平均数据替代个人数据
--------------------------------------------------------------------------------
gr = df.groupby('key')['value'] # 取得 分组后的 value
g2= gr.transform(lambda x : x.mean())
g2 输出:
0 4.5
1 5.5
2 6.5
3 4.5
4 5.5
5 6.5
6 4.5
7 5.5
8 6.5
9 4.5
10 5.5
11 6.5
Name: value, dtype: float64
--------------------------------------------------------------------------------
a 组 [0,3,6,9] 是一个参数 传递个 transform 指定的方法,即我们的 lambda, 结果返回了
平均值 4.5, transform 又把 4.5 放到放到 和 [0,3,6,9] 同型的列表中,等到所有分组执行
完了,组合那些组,恢复原顺序 返回
--------------------------------------------------------------------------------
g2= gr.transform('count') # 如果是包中的方法,可以直接传递字符串
g2= gr.transform('mean') # max min ....
--------------------------------------------------------------------------------
g.transform(lambda x: x.rank(ascending=False))

--------------------------------------------------------------------------------
# apply 和 transform 等价作用,apple 只能传入方法,不能传入 包中已有的字符串方法
f = lambda x : x.mean()
g2= gr.apply(f)
--------------------------------------------------------------------------------
TimeGroupe
================================================================================
链式编程技术: 所有代码写在一行上,减少中间变量,比如: A.b[xx].cxx.dxxx(xx,as).xx
--------------------------------------------------------------------------------
熟悉了自然就会链式编程了,现在简单记录一下

df2 = df.copy()
df2['k'] = v

# Functional assign way
df2 = df.assign(k=v)

使用 assign 变成和上面的效果一样,但是可以有链式编程的可能性

df.pipe(方法1, f1的参数)
.pipe(方法2, f2的参数)
.pipe(方法3, f3的参数))
这样就能一直.pipe 下去,全文只有这一行代码,可读性差。



>> 目录 << 


 

分享
收藏
点赞人
举报
文章标签
评论列表

推荐

暂无推荐