如何使用pivot将2列添加到pandas

时间:2017-06-01 17:45:21

标签: pandas dataframe pivot

我有一个包含4列的数据框(a,b,c,d是列名):

df = 
a   b   c    d
1   2   3    4
5   2   7    8

是否可以使用df.pivot()将2列添加到列多索引中?以下不起作用:

df.pivot('a', ['b', 'c'])

我想要

b  2
c  3   7
a  
1  4   NA
5  NA  8

我知道我可以使用pivot_table轻松完成这项工作(pd.pivot_table(df, index='a', columns=['b', 'c'])),但我对pivot的灵活性感到好奇,因为文档不明确。

3 个答案:

答案 0 :(得分:3)

显然缺少一些实现,我认为你找到了一个。我们有解决方法,但你是正确的,文档说,columns参数可以是一个对象,但似乎没有任何工作。我相信@MaxU和@jezrael给了它一个很好的尝试,我们似乎都没有能够让它工作,因为文档说应该。我称之为虫子!如果其他人在我到达之前没有或没有,我可能会报告。

那说,我找到了这个,这很奇怪。我计划将列表传递给index参数,然后进行转置。但相反,字符串'c''b'被用作索引值......这根本不是我想要的。

这是什么陌生人

df.pivot(['c', 'b'], 'a', 'd')

a    1    5
b  NaN  8.0
c  4.0  NaN

此外,这看起来很好:

df.pivot('a', 'b', 'd')

b  2
a   
1  4
5  8

但这里的错误令人困惑

print(df.pivot('a', ['b'], 'd'))
KeyError: 'Level b not found'

任务继续......

OP自己的答案
无视

使用pivot_table

  

df.pivot_table(values = None,index = None,columns = None,aggfunc ='mean',fill_value = None,marginins = False,dropna = True,margins_name ='All')

df.pivot_table('d', 'a', ['b', 'c'])

b    2     
c    3    7
a          
1  4.0  NaN
5  NaN  8.0

答案 1 :(得分:2)

没有汇总的最近解决方案是set_index + unstack

df = df.set_index(['b','c','a'])['d'].unstack([0,1])
print (df)
b    2     
c    3    7
a          
1  4.0  NaN
5  NaN  8.0

使用pivot的解决方案,但有点疯狂 - 需要创建MultiIndex并最后转置:

df = df.set_index(['b','c'])
df = df.pivot(columns='a')['d'].T
print (df)
b    2     
c    3    7
a          
1  4.0  NaN
5  NaN  8.0

答案 2 :(得分:2)

我们也可以使用pd.crosstab

In [80]: x
Out[80]:
   a  b  c  d
0  1  2  3  4
1  5  2  7  8

In [81]: pd.crosstab(x.a, [x.b, x.c], x.d, aggfunc='mean')
Out[81]:
b    2
c    3    7
a
1  4.0  NaN
5  NaN  8.0