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请尝试用无或空字符串填充列表。