【问题标题】:Dynamically reshape the dataframe in pandas动态重塑 pandas 中的数据框
【发布时间】:2017-07-21 04:16:33
【问题描述】:

我有一个有 4 列和 4 行的数据框。我需要将其重塑为 2 列和 4 行。 2 个新列是 c​​ol1 + col3 和 col2 + col4 值相加的结果。我不希望为它创建任何其他内存对象。

我在努力

df['A','B'] = df['A']+df['C'],df['B']+df['D']

只用drop函数可以实现吗?还有其他更简单的方法吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    一次对两列求和的动态方式是使用groupby:

    df.groupby(np.arange(len(df.columns)) % 2, axis=1).sum()
    Out[11]: 
        0   1
    0   2   4
    1  10  12
    2  18  20
    3  26  28
    

    如果您想更改列名,则可以在之后使用重命名,但这需要一个逻辑。

    【讨论】:

      【解决方案2】:

      考虑示例数据框df

      df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'))
      df
      
          A   B   C   D
      0   0   1   2   3
      1   4   5   6   7
      2   8   9  10  11
      3  12  13  14  15
      

      一行代码

      pd.DataFrame(
          df.values.reshape(4, 2, 2).transpose(0, 2, 1).sum(2),
          columns=df.columns[:2]
      )
      
          A   B
      0   2   4
      1  10  12
      2  18  20
      3  26  28
      

      另一行代码

      df.iloc[:, :2] + df.iloc[:, 2:4].values
      
          A   B
      0   2   4
      1  10  12
      2  18  20
      3  26  28
      

      又一个

      df.assign(A=df.A + df.C, B=df.B + df.D).drop(['C', 'D'], 1)
      
          A   B
      0   2   4
      1  10  12
      2  18  20
      3  26  28
      

      【讨论】:

        【解决方案3】:

        这对我有用:

        df['A'], df['B'] = df['A'] + df['C'], df['B'] + df['D']
        df.drop(['C','D'], axis=1)
        

        【讨论】:

        • 感谢@jxstanford 的回答。可以用一行代码完成吗?
        • 当然,虽然我不相信这对我的示例的性能很重要,并且会损害 IMO 的可读性。 FWIW,由于它的灵活性和惯用特性,我已经将向上箭头指向@ayhan 的答案。