Fork me on github

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
posted on 2020-12-27 21:14  markyle  阅读(98)  评论(0编辑  收藏  举报