2017-06-06 87 views
2

我想知道如何合并多个列并再次拆分它们。在熊猫数据框中合并和拆分列

输入数据

A B C 
1 3 5 
2 4 6 

合并A,B,C到一个列X

X 
1 
2 
3 
4 
5 
6 

过程一些与X,然后再次分裂X为A,B,C。 A,B,C的行数是相同的(2)。

A B C 
1 3 5 
2 4 6 

有没有简单的方法来完成这项工作?

回答

3

开始与df:

A B C 
0 1 3 5 
1 2 4 6 

下,得到一个列中的所有值:

df2 = df.unstack().reset_index(drop=True).rename('X').to_frame() 

print(df2) 

    X 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 

而且,转换回原来的形状:

df3 = pd.DataFrame(df2.values.reshape(2,-1, order='F'), columns=list('ABC')) 
print(df3) 

    A B C 
0 1 3 5 
1 2 4 6 
+0

我认为没有必要放弃索引。 –

+0

@PaulH试图匹配OP的预期输出,但你是正确的,这是不需要的。 –

+0

@ScottBoston,df3的输出结果与此处显示的不一样。数据可能需要先转置。 – Allen

1

未在你喜欢的方式放松,你需要或者unstackravelorder='F'

选项1

def proc1(df): 
    v = df.values 
    s = v.ravel('F') 
    s = s * 2 
    return pd.DataFrame(s.reshape(v.shape, order='F'), df.index, df.columns) 

proc1(df) 

    A B C 
0 2 6 10 
1 4 8 12 

选项2

def proc2(df): 
    return df.unstack().mul(2).unstack(0) 


proc2(df) 

    A B C 
0 2 6 10 
1 4 8 12 
+0

'堆()MUL(2).unstack()' –

+0

@ PaulH注意到OP要求按列方式堆叠的值......这意味着将行索引放到列上,因此首先是“unpack”。然后处理任何事情(我选择'mul(2)'),然后'unstack(0)'来取代堆叠。我在'mul(2)'中选择了一个不好的例子来证明细微差别 – piRSquared

+0

ahh,在单级列索引的情况下,'stack'和'unstack'做同样的事情(我觉得奇怪) –

2

设置

df=pd.DataFrame({'A': {0: 1, 1: 2}, 'B': {0: 3, 1: 4}, 'C': {0: 5, 1: 6}}) 

df 
Out[684]: 
    A B C 
0 1 3 5 
1 2 4 6 

合并DF 1柱:

df2 = pd.DataFrame(df.values.flatten('F'),columns=['X']) 
Out[686]: 
    X 
0 1 
1 2 
2 3 
3 4 
4 5 
5 6 

拆分它回到第三列:?

pd.DataFrame(df2.values.reshape(-1,3,order='F'),columns=['A','B','C']) 
Out[701]: 
    A B C 
0 1 3 5 
1 2 4 6 
+0

功能平坦也似乎是合并多列的好主意。谢谢您的回答。 – z991