我有一个包含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
的灵活性感到好奇,因为文档不明确。
答案 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自己的答案
无视
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