Pandas连接交替的列

sac*_*ruk 4 python pandas

我有两个数据帧如下:

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

我希望以交替的方式获取列,以便得到以下结果:

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
Run Code Online (Sandbox Code Playgroud)

我觉得这个解决方案效率很低.这样做的pythonic/pandic方式是什么?

ps在我的特定情况下,列名不是A,B,C,D,也不是按字母顺序排列的.只知道我想要合并哪两个数据帧.

jez*_*ael 7

如果您需要更具动态性的内容,请首先压缩两个DataFrame的两个列名称,然后将其展平:

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
Run Code Online (Sandbox Code Playgroud)


klo*_*ffy 5

这个怎么样?

df4 = pd.concat([df2, df3], axis=1)
Run Code Online (Sandbox Code Playgroud)

或者它们必须按特定顺序排列?无论如何,您可以随时重新排序它们:

df4 = df4[['A','B','C','D']]
Run Code Online (Sandbox Code Playgroud)

无需写出列:

df4 = df4[[item for items in zip(df2.columns, df3.columns) for item in items]]
Run Code Online (Sandbox Code Playgroud)