【问题标题】:Combine two columns with same column name using pandas使用熊猫组合具有相同列名的两列
【发布时间】:2021-11-16 19:37:09
【问题描述】:

我有一个数据框 (df),其中两列的长度不同。我想将这两列合并为一列。我该怎么做?

表格如下所示:

Col_1 Col_2 Col_1 Col3
A1 12 A1 345
A2 34 A2 980
A3 098 A3 543
A4 8765
A5 765

我想将 Col_1 合并为表中的一列。输出应如下所示:

所需的输出:

Col_1 Col_2 Col3
A1 12 345
A2 34 980
A3 098 543
A4 8765
A5 765

到目前为止我尝试了什么?

df1 = df.columns[0]
df2 = df.columns[2]
df_merge_col = pd.merge(df1, df2, on='Col_1')

df["Col_1"] = df["Col_1"].astype(str) + df["Col_1"]

【问题讨论】:

    标签: python pandas dataframe merge concatenation


    【解决方案1】:

    这是使用MultiIndexstack 的通用解决方案。

    总而言之,它通过添加唯一 id 来对列进行重复数据删除,然后我们将其用于stack 数据。剩下的只是分类/清理。

    (df.set_axis(pd.MultiIndex.from_arrays([df.columns,
                                            df.groupby(level=0, axis=1).cumcount()
                                           ]), axis=1)
       .stack(level=1)
       .sort_index(level=1)
       .droplevel(1)
       .drop_duplicates(subset=df.columns[df.columns.duplicated()])
    )
    

    输出:

      Col_1   Col_2  Col_3
    0    A1    12.0  345.0
    1    A2    34.0  980.0
    2    A3    98.0  543.0
    3    A4  8765.0    NaN
    4    A5   765.0    NaN
    

    【讨论】:

    • 为了避免修改原来的df,我稍微修改了一下代码,但还是一样
    【解决方案2】:

    您可以通过以下方式使用np.where 完成此任务:

    import numpy as np
    import pandas as pd
    df = pd.DataFrame([['A1', 'A1'], ['A2', 'A2'], ['A3', None], ['A4', None]])
    combined = np.where(df[0].isnull(), df[1], df[0])
    df.drop(columns=[0, 1], inplace=True)
    df[0] = combined
    print(df)
    

    输出

        0
    0  A1
    1  A2
    2  A3
    3  A4
    

    np.where 类似于 pandas.Series 的三元运算符,其中第 0 列没有值从第 1 列获取值,否则从第 0 列获取值

    【讨论】:

      【解决方案3】:

      如果用于按位置过滤的重复列名称使用DataFrame.iloc,则通过DataFrame.dropna 使用外连接删除NaNs 行:

      df1 = df.iloc[:, :2].dropna(subset=['Col_1'])
      df2 = df.iloc[:, 2:].dropna(subset=['Col_1'])
      df_merge_col = pd.merge(df1, df2, on='Col_1', how='outer')
      print (df_merge_col)
        Col_1  Col_2  Col3
      0    A1   12.0   345
      1    A2   34.0   980
      2    A3   98.0   543
      3    A4    NaN  8765
      4    A5    NaN   765
      

      【讨论】:

      • 我有同样的问题,但有超过 2 列同名。有什么方法可以推广这个解决方案?
      • @ElizaR - 嗯,如果 mozway 解决方案无法正常工作,最好发布新问题。
      猜你喜欢
      • 1970-01-01
      • 2016-08-12
      • 2021-05-28
      • 1970-01-01
      • 2017-02-20
      • 2021-12-05
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      相关资源
      最近更新 更多