import pandas as pd 报错_功夫pandas(三)变形

e7a5212fdba16b9cbad39e29fa6e7c5d.png

前言

pandas是Python的一个数据分析库,提供如DataFrame等十分容易操作的数据结构,是近年做数据分析时不可或缺的工具之一。

但是pandas知识点繁多,同一个操作可以用多种不同的方法实现,再加上网上满坑满谷的教学资料,质量参差不齐,导致很多初学者常常看完后不知所云,且很快就忘掉了。本系列正是从这点出发,将60个常用的pandas知识点由浅入深地分成4大类别:Pandas基础理论、三类操作(分组、变形、合并)、四类数据(缺失数据、文本数据、分类数据、时序数据)、综合例子(带你再次完整走一遍前面所有操作)。保证你看完后足以应付日常90%的情景。

废话不多说啦,让我们开始这趟pandas旅程吧!

本文介绍三类操作中的变形,主要内容概览:

52896892b1b27eed819e546c0c1442aa.png

文末放上代码


变形通常是指改变行列索引的操作。形象化描述就是拉伸、挤压Dataframe

1. 列值变列索引

1.1 pivot

pivot是把列的值变成列的索引。形象化描述就是变矮,变胖。见下图

pivot有三个参数:

  1. index:指定新产生的行索引
  2. columns:指定那几列的列值变列索引
  3. values:填充新产生的列值
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two',
                           'two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'baz': [1, 2, 3, 4, 5, 6],
                   'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df

df.pivot(index='foo', columns='bar', values='baz')

#不指定values,就会吧剩下的所有列作为多列组合
df.pivot(index='foo', columns='bar')

73213bd7ebe8b8f44e0adf7ef7393d5c.png

1.2 pivot_table

如果有两行数据完全想通,那么使用pivot就会报错,如下代码

df = pd.DataFrame({'foo': ['one', 'one', 'one', 'one', 'two',
                           'two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'baz': [1, 2, 3, 1, 5, 6]})
df

#会报错
df.pivot(index='foo', columns='bar', values='baz')

3fb42d63c11a78e8ba718ee71081f56f.png

上表第0行与第3行数据一样,会报错。

所以我们使用pivot_table代替pivot,功能和pivot一样,只是能用aggfunc聚合重复数据,margins代表汇总值

df.pivot_table(index='foo', columns='bar', values='baz', aggfunc=np.mean, margins=True)

5ca7a7131f9c4b301a82218ec255d5e0.png

2. 列索引变列值

melt实现。类似于pivot的反向操作,形象化描述就是变高、变瘦。见下图

df = pd.DataFrame({'first': ['John', 'Mary'],
                           'last': ['Doe', 'Bo'],
                           'height': [5.5, 6.0],
                           'weight': [130, 150]})
df

#id_vars表示需要保留的列,value_vars表示需要stack的一组列
df.melt(id_vars=['first', 'last'], value_vars=['height','weight'])

#指定新的列索引名字
df.melt(id_vars=['first', 'last'], value_vars='weight',var_name='myVarname', value_name='myValname')

173a24d17369df21af1dc36509341597.png

3. 行索引与列索引移动

stack把列索引移到行索引、unstack是stack反向操作

#多索引
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz'],
                       ['one', 'two', 'one', 'two']]))
   

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

df = pd.DataFrame(np.arange(8).reshape(4,2), index=index, columns=['A', 'B'])

df
#列索引移到行索引,列索引是单层索引,移动后没有列索引了,所以结果是Series
df.stack()
type(df.stack())

#行索引是多层索引,移动后还是Dataframe
df.unstack()

c0aa65c3daa68e175a7506d18c3139ff.png

stack和unstack有个重要的参数level:对于多层索引而言,用level指定移动哪一层索引。默认是-1,即最里面的一层。见下图

在这个例子中unstack()=unstack(2)

5a2ac5309a9e500901e7461168c20d69.png
image-20200426135334755

12aa745b4857bbacf6e7a21d4a3378b7.png

c075842e14e5ff4c74add9de85365952.png

**总结:**stack、unstack与pivot、melt不同的是,stack是移动行列索引,而pivot是移动列索引和列值。

4. Dummy Variable(哑变量)

这里主要介绍get_dummies函数,其功能主要是进行one-hot编码。

df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'],
                   'C': [1, 2, 3]})
df
pd.get_dummies(df)

#可选prefix参数添加前缀,prefix_sep添加分隔符
pd.get_dummies(df, prefix='col', prefix_sep='+')

a53990d01757f8ebdbd9c4a89b0c7f25.png

Pandas get_dummies 与 Sklearn OneHotEncoder区别:

  1. sklearn.preprocessing 下的 OneHotEncoder 不可以直接处理 string,如果数据集中的某些特征是 string 类型的话,需要首先将其转换为 integers 类型
  2. OneHotEncoder 实例的 fit 方法将不再接收 1 维数组,而必须是显式的二维形式,get_dummies则都可以

如果没有特殊需求,推荐使用get_dummies

5. factorize(因子化)

factorize方法,该方法主要用于自然数编码,并且缺失值会被记做-1,其中sort参数表示是否排序后赋值

codes, uniques = pd.factorize(['b', None, 'a', 'c', 'b'], sort=True)
codes
uniques

array([ 1, -1, 0, 2, 1]) array(['a', 'b', 'c'], dtype=object)

最后给大家留几个思考题:

  1. 既然melt起到了stack的功能,为什么再设计stack函数?
  2. pivot/melt/stack/unstack这些函数的使用场景是什么?

代码地址

maoweixy/machine-learning​github.com
fd63dc50ebff3421947818bb9dc94305.png

参考

  1. https://github.com/datawhalechina/joyful-pandas
  2. Python for Data Analysis Wes McKinney著
  3. Pandas Cookbook Theodore Petrou著

本期文章内容到此为止。如果大家觉得写得还行,请给我点个赞,这是对我最大的鼓励!我会尽快更新后续的系列文章,欢迎大家关注我,与我一起学习,一起快乐AI~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值