2016-07-26 75 views
4

我有两个dataframes如下:熊猫拼接交替列

df2 = pd.DataFrame(np.random.randn(5,2),columns=['A','C']) 
df3 = pd.DataFrame(np.random.randn(5,2),columns=['B','D']) 

我希望得到交替的方式,使得我得到下面的结果列:

df4 = pd.DataFrame() 
for i in range(len(df2.columns)): 
    df4[df2.columns[i]]=df2[df2.columns[i]] 
    df4[df3.columns[i]]=df3[df3.columns[i]] 

df4 

    A B C D 
0 1.056889 0.494769 0.588765 0.846133 
1 1.536102 2.015574 -1.279769 -0.378024 
2 -0.097357 -0.886320 0.713624 -1.055808 
3 -0.269585 -0.512070 0.755534 0.855884 
4 -2.691672 -0.597245 1.023647 0.278428 

我想我对于这种解决方案来说,效率确实很低。这样做的更多pythonic/pandic的方式是什么?

p.s.在我的具体情况下,列名不是A,B,C,D,也不是按字母顺序排列的。只是知道我想结合哪两个数据框。

+3

哈,_〜pandic〜_。 – miradulo

+0

两个数据帧中有多少列与实际数据? – jezrael

+0

列数相等,现在让我们说2。 –

回答

7

如果你需要的东西更有活力,首先压缩两个DataFrames的两列名称,然后扁它:

df5 = pd.concat([df2, df3], axis=1) 
print (df5) 
      A   C   B   D 
0 0.874226 -0.764478 1.022128 -1.209092 
1 1.411708 -0.395135 -0.223004 0.124689 
2 1.515223 -2.184020 0.316079 -0.137779 
3 -0.554961 -0.149091 0.179390 -1.109159 
4 0.666985 1.879810 0.406585 0.208084 

#http://stackoverflow.com/a/10636583/2901002 
print (list(sum(zip(df2.columns, df3.columns),()))) 
['A', 'B', 'C', 'D'] 
print (df5[list(sum(zip(df2.columns, df3.columns),()))]) 
      A   B   C   D 
0 0.874226 1.022128 -0.764478 -1.209092 
1 1.411708 -0.223004 -0.395135 0.124689 
2 1.515223 0.316079 -2.184020 -0.137779 
3 -0.554961 0.179390 -0.149091 -1.109159 
4 0.666985 0.406585 1.879810 0.208084 
+0

据我所知,zip将列名放在''('A','B'),('C','D')]',我可以看到'sum'做了什么,但你能解释'sum'做了什么吗?这很难理解为什么这个空元组'()'帮助扩展该压缩数组 –

+0

这只是将在第一个参数中传递的iterable的元素相加,将第二个参数视为总和的初始值(如果没有给出,则为0用来代替,这种情况会给你一个错误)。所以输出是'tuple' - '('A','B','C','D')',它被转换为'list'。 – jezrael

2

这个怎么样?

df4 = pd.concat([df2, df3], axis=1) 

还是他们必须按照特定的顺序?无论如何,你可以随时重新排序:

df4 = df4[['A','B','C','D']] 

而无需编写出列:

df4 = df4[[item for items in zip(df2.columns, df3.columns) for item in items]] 
+1

_“我想以交替的方式得到列”_所以从第一列开始,然后从第二列开始,然后从第一列开始第二列,等等.. – miradulo

+0

@Mitch Gotcha,在重新排序时添加了一些列。 – kloffy

+0

这是一个解决方案,但我认为重点不在于写出列名,以便能够以交替方式获取列。 –

1

将偶数索引追加到df2列,奇数索引追加到df3列。使用这些新级别进行排序。

df2_ = df2.T.set_index(np.arange(len(df2.columns)) * 2, append=True).T 
df3_ = df3.T.set_index(np.arange(len(df3.columns)) * 2 + 1, append=True).T 

df = pd.concat([df2_, df3_], axis=1).sort_index(1, 1) 
df.columns = df.columns.droplevel(1) 

df 

enter image description here

2

你可以concat,然后reindex_axis

df = pd.concat([df2, df3], axis=1) 
df.reindex_axis(df.columns[::2].tolist() + df.columns[1::2].tolist(), axis=1)