Pandas变形
一 列值变列索引
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')
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')
所以我们使用pivot_table代替pivot,功能和pivot一样,只是能用aggfunc聚合重复数据,margins代表汇总值
df.pivot_table(index='foo', columns='bar', values='baz', aggfunc=np.mean, margins=True)
二 列索引变列值
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')
三 行索引与列索引移动
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,即最里面的一层。
总结:stack、unstack与pivot、melt不同的是,stack是移动行列索引,而pivot是移动列索引和列值。
四 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
五 factorize(因子化)
factorize方法,该方法主要用于自然数编码,并且缺失值会被记做-1,其中sort参数表示是否排序后赋值
codes, uniques = pd.factorize(['b', None, 'a', 'c', 'b'], sort=True)
codes
uniques