Python dataframe-将列值转换为单个列

Python dataframe-将列值转换为单个列,python,pandas,dataframe,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 df=df.set_index(['XY','UV','BC']) df=df.unstack('BC') 我想买一个 X

我有这样的想法:

   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
df=df.set_index(['XY','UV','BC'])
df=df.unstack('BC')
我想买一个

   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列可以包含许多不同的项,因此我需要一个在一般情况下工作的解决方案,而不仅仅是两个不同的值

我试着编写一些代码来拆分数据帧,而不是重新连接单独的部分,但它开始看起来太复杂了,而且没有任何作用。

IIUC您想:

编辑

pivot
不支持多索引df,这是我正在考虑的一种方法,您可以添加一个新列,它是两列的组合,并将其用作
pivot
上的索引:

In [120]:
df['composite'] = df['XY']+df['UV']
df

Out[120]:
  XY UV BC  Val composite
0  y  u  c   11        yu
1  y  u  b   22        yu
2  y  v  c   33        yv
3  y  v  b   44        yv
4  x  u  c  111        xu
5  x  u  b  222        xu
6  x  v  c  333        xv
7  x  v  b  444        xv

In [121]:
df.pivot(index='composite', columns='BC', values='Val')

Out[121]:
BC           b    c
composite          
xu         222  111
xv         444  333
yu          22   11
yv          44   33
你想:

编辑

pivot
不支持多索引df,这是我正在考虑的一种方法,您可以添加一个新列,它是两列的组合,并将其用作
pivot
上的索引:

In [120]:
df['composite'] = df['XY']+df['UV']
df

Out[120]:
  XY UV BC  Val composite
0  y  u  c   11        yu
1  y  u  b   22        yu
2  y  v  c   33        yv
3  y  v  b   44        yv
4  x  u  c  111        xu
5  x  u  b  222        xu
6  x  v  c  333        xv
7  x  v  b  444        xv

In [121]:
df.pivot(index='composite', columns='BC', values='Val')

Out[121]:
BC           b    c
composite          
xu         222  111
xv         444  333
yu          22   11
yv          44   33

您也可以像这样使用多索引和取消堆栈:

   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
df=df.set_index(['XY','UV','BC'])
df=df.unstack('BC')

您也可以像这样使用多索引和取消堆栈:

   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
df=df.set_index(['XY','UV','BC'])
df=df.unstack('BC')

在这里,我喜欢使用多级索引和堆栈/取消堆栈

所以在这里,我要做:

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
所以我们在行和列上都有多个索引。假设你不想这样,我会:

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

在这里,我喜欢使用多级索引和堆栈/取消堆栈

所以在这里,我要做:

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
所以我们在行和列上都有多个索引。假设你不想这样,我会:

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

如果我有多个类似于XY的列,index=子句看起来如何?很抱歉添加了这样一个问题。我真的不明白你在问什么,正如我之前所说的,除非你发布一个带有代表性数据和期望输出的问题,否则回答推测性问题就变得很困难。请看我改进的示例。ThanksHow如果有多个类似于XY的列,index=子句看起来像什么?很抱歉添加了这样一个问题。我真的不明白你在问什么,正如我之前所说的,除非你发布一个带有代表性数据和期望输出的问题,否则回答推测性问题就变得很困难。请看我改进的示例。ThanksHow我是否将列索引从“BC”重命名为“index”?这实际上是列索引级别的名称。请尝试
xtab.columns.names=[]
或者它可能是
xtab.columns.index.names=[]
I Get ValueError:新名称的长度必须为1,Get 0尝试用无或空字符串填充列表。如何将列索引从“BC”重命名为“index”?这实际上是列索引级别的名称。请尝试
xtab.columns.names=[]
或者它可能是
xtab.columns.index.names=[]
I Get ValueError:新名称的长度必须为1,Get 0请尝试用无或空字符串填充列表。