前言
pandas是Python的一个数据分析库,提供如DataFrame等十分容易操作的数据结构,是近年做数据分析时不可或缺的工具之一。
但是pandas知识点繁多,同一个操作可以用多种不同的方法实现,再加上网上满坑满谷的教学资料,质量参差不齐,导致很多初学者常常看完后不知所云,且很快就忘掉了。本系列正是从这点出发,将60个常用的pandas知识点由浅入深地分成4大类别:Pandas基础理论、三类操作(分组、变形、合并)、四类数据(缺失数据、文本数据、分类数据、时序数据)、综合例子(带你再次完整走一遍前面所有操作)。保证你看完后足以应付日常90%的情景。
废话不多说啦,让我们开始这趟pandas旅程吧!
本文介绍三类操作中的变形,主要内容概览:
文末放上代码
变形通常是指改变行列索引的操作。形象化描述就是拉伸、挤压Dataframe
1. 列值变列索引
1.1 pivot
pivot是把列的值变成列的索引。形象化描述就是变矮,变胖。见下图
pivot有三个参数:
- index:指定新产生的行索引
- columns:指定那几列的列值变列索引
- 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')
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')
上表第0行与第3行数据一样,会报错。
所以我们使用pivot_table代替pivot,功能和pivot一样,只是能用aggfunc聚合重复数据,margins代表汇总值
df.pivot_table(index='foo', columns='bar', values='baz', aggfunc=np.mean, margins=True)
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')
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()
stack和unstack有个重要的参数level:对于多层索引而言,用level指定移动哪一层索引。默认是-1,即最里面的一层。见下图
在这个例子中unstack()=unstack(2)
**总结:**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='+')
Pandas get_dummies 与 Sklearn OneHotEncoder区别:
- sklearn.preprocessing 下的 OneHotEncoder 不可以直接处理 string,如果数据集中的某些特征是 string 类型的话,需要首先将其转换为 integers 类型
- 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)
最后给大家留几个思考题:
- 既然melt起到了stack的功能,为什么再设计stack函数?
- pivot/melt/stack/unstack这些函数的使用场景是什么?
代码地址
maoweixy/machine-learninggithub.com参考
- https://github.com/datawhalechina/joyful-pandas
- Python for Data Analysis Wes McKinney著
- Pandas Cookbook Theodore Petrou著
本期文章内容到此为止。如果大家觉得写得还行,请给我点个赞,这是对我最大的鼓励!我会尽快更新后续的系列文章,欢迎大家关注我,与我一起学习,一起快乐AI~