我有这样的事情:
XY UV BC Val
0 y u c 11
1 y u b 22
2 y v c 33
3 y v b 44
4 x u c 111
5 x u b 222
6 x v c 333
7 x v b 444
我想得到
XY UV B_Val C_Val
0 y u 22 11
1 y v 44 33
2 x u 222 111
3 x v 444 333
一般来说,上面的BC列可以包含许多不同的项目,因此我需要一个适用于一般情况的解决方案,不仅适用于2个不同的值。
我尝试编写一些分割数据帧的代码,而不是重新加入单独的部分,但它开始看起来太复杂了,而且它不会去任何地方。
答案 0 :(得分:2)
你希望pivot
的IIUC:
In [110]:
df.pivot(index='XY',columns='BC', values='Val')
Out[110]:
BC b c
XY
x 10 20
y 33 44
修改强>
pivot
不支持多索引df,这是我正在考虑的一种方法,你可以做的是添加一个新列,它是2列的组合,并使用它作为{{的索引1}} on:
pivot
答案 1 :(得分:2)
这里我喜欢使用多级索引和堆栈/取消堆栈。
所以在这里,我会这样做:
from io import StringIO
import pandas
datacsv = StringIO("""\
XY UV BC Val
y u c 11
y u b 22
y v c 33
y v b 44
x u c 111
x u b 222
x v c 333
x v b 444
""")
df = pandas.read_csv(datacsv, sep='\s+')
df.set_index(['XY', 'UV', 'BC']).unstack(level='BC')
这给了我们:
Val
BC b c
XY UV
x u 222 111
v 444 333
y u 22 11
v 44 33
因此我们在行和列上都有MultiIndexes。假设你不想那样,我会这样做:
xtab = (df.set_index(['XY', 'UV', 'BC'])
.unstack(level='BC')['Val']
.reset_index())
那会给你:
BC XY UV b c
0 x u 222 111
1 x v 444 333
2 y u 22 11
3 y v 44 33
答案 2 :(得分:1)
你也可以像这样使用多索引和取消堆栈:
df=df.set_index(['XY','UV','BC'])
df=df.unstack('BC')