【问题标题】:Pandas: Multiple columns into one columnPandas:多列合并为一列
【发布时间】:2021-10-31 04:50:41
【问题描述】:

我有以下数据(2 列,4 行):

Column 1: A, B, C, D

Column 2: E, F, G, H

我正在尝试将这些列组合成一列,看起来像这样(1 列,8 行):

Column 3: A, B, C, D, E, F, G, H

我正在使用 pandas DataFrame 并尝试使用不同的函数但没有成功(appendconcat 等)。任何帮助将不胜感激!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    诀窍是使用stack()

    df.stack().reset_index()
        
       level_0   level_1  0
    0        0  Column 1  A
    1        0  Column 2  E
    2        1  Column 1  B
    3        1  Column 2  F
    4        2  Column 1  C
    5        2  Column 2  G
    6        3  Column 1  D
    7        3  Column 2  H
    

    【讨论】:

    • 与 OP 要求的列相比,此答案最右列中的值的顺序是否错误?
    【解决方案2】:

    更新

    pandas 有一个用于此 stack 的内置方法,它可以执行您想要查看其他 answer 的操作。

    这是我多年前知道stack之前的第一个答案:

    In [227]:
    
    df = pd.DataFrame({'Column 1':['A', 'B', 'C', 'D'],'Column 2':['E', 'F', 'G', 'H']})
    df
    Out[227]:
      Column 1 Column 2
    0        A        E
    1        B        F
    2        C        G
    3        D        H
    
    [4 rows x 2 columns]
    
    In [228]:
    
    df['Column 1'].append(df['Column 2']).reset_index(drop=True)
    Out[228]:
    0    A
    1    B
    2    C
    3    D
    4    E
    5    F
    6    G
    7    H
    dtype: object
    

    【讨论】:

      【解决方案3】:

      您可以使用ravel 将列方向的值展平,速度要快得多。

      In [1238]: df
      Out[1238]:
        Column 1 Column 2
      0        A        E
      1        B        F
      2        C        G
      3        D        H
      
      In [1239]: pd.Series(df.values.ravel('F'))
      Out[1239]:
      0    A
      1    B
      2    C
      3    D
      4    E
      5    F
      6    G
      7    H
      dtype: object
      

      详情

      中等

      In [1245]: df.shape
      Out[1245]: (4000, 2)
      
      In [1246]: %timeit pd.Series(df.values.ravel('F'))
      10000 loops, best of 3: 86.2 µs per loop
      
      In [1247]: %timeit df['Column 1'].append(df['Column 2']).reset_index(drop=True)
      1000 loops, best of 3: 816 µs per loop
      

      In [1249]: df.shape
      Out[1249]: (40000, 2)
      
      In [1250]: %timeit pd.Series(df.values.ravel('F'))
      10000 loops, best of 3: 87.5 µs per loop
      
      In [1251]: %timeit df['Column 1'].append(df['Column 2']).reset_index(drop=True)
      100 loops, best of 3: 1.72 ms per loop
      

      【讨论】:

      • df.values 正在输出到底层数组,并在其上调用 numpy.ravel()。但是 pandas 提供stack()
      • DataFrame.to_numpy() 优于 DataFrame.values
      【解决方案4】:

      您似乎只是寻求帮助以创建另一个数据视图。如果没有理由这些数据首先在两列中,那么只需创建一列。但是,如果您需要将它们组合起来在其他工具中进行演示,您可以执行以下操作:

      import itertools as it, pandas as pd
      df = pd.DataFrame({1:['a','b','c','d'],2:['e','f','g','h']})
      sorted(it.chain(*df.values))
      # -> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
      

      【讨论】:

        猜你喜欢
        • 2017-12-04
        • 1970-01-01
        • 2022-07-21
        • 2016-09-22
        • 2019-10-19
        • 2016-01-10
        • 2020-05-01
        相关资源
        最近更新 更多