【问题标题】:Pandas concatenate alternating columns熊猫连接交替列
【发布时间】:2016-07-26 06:21:04
【问题描述】:

我有两个数据框如下:

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

我认为我对这个解决方案的效率真的很低。这样做更蟒蛇/泛泛的方式是什么?

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

【问题讨论】:

  • 两个数据框中有多少列包含真实数据?
  • 列数相等,现在假设为 2。

标签: python pandas


【解决方案1】:

这个怎么样?

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]]

【讨论】:

  • “我想以交替的方式获取列” 所以第一列中的一个,第二列中的一个,第一列中的第二个,等等。 .
  • @Mitch Gotcha,添加了一些关于重新排序列的内容。
  • 这是一个解决方案,但我想重点不是我写出列名以便能够以交替方式获取列。
  • 你迟到了几秒钟才让答案被接受,@jezrael 打败了你。对不起
【解决方案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)

【讨论】:

    【解决方案3】:

    将偶数索引附加到 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
    

    【讨论】:

      【解决方案4】:

      如果您需要更动态的内容,请先压缩两个 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
      

      【讨论】:

      • 我知道 zip 会放置列名称,以便您获得 [('A', 'B'), ('C', 'D')],我可以看到 sum 做了什么,但您能解释一下 sum 做了什么吗?尤其难以理解为什么空元组 () 有助于扩展压缩数组
      • 这只是对第一个参数中传递的 iterable 的元素求和,将第二个参数视为总和的初始值(如果没有给出,则使用 0 代替,这种情况下会报错)。所以输出是tuple - ('A', 'B', 'C', 'D') 转换为list
      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多