Pandas数据帧 - 将列值转换为单个列

时间:2015-11-09 16:24:22

标签: python pandas dataframe

我有这样的事情:

   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个不同的值。

我尝试编写一些分割数据帧的代码,而不是重新加入单独的部分,但它开始看起来太复杂了,而且它不会去任何地方。

3 个答案:

答案 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')