【问题标题】:python: combine two columns into one and duplicate corresponding cells [duplicate]python:将两列合并为一并复制相应的单元格[重复]
【发布时间】:2020-07-09 11:40:38
【问题描述】:

有一个包含三列的数据框:

    ID    col1    col2
0    item_1    abc    NaN
1    item_2    bcd    NaN
2    item_3    NaN    NaN
3    item_4    mnb    lkj

我想像这样组合col1col2

    ID    col1
    item_1    abc
    item_2    bcd
    item_3    NaN
    item_4    mnb
    item_4    lkj

ID 不是索引而是列。

我尝试使用stack().reset_index(),但这不是我想要的。

有什么想法吗?

【问题讨论】:

  • 这能回答你的问题吗? Combining columns of dataframe
  • 试试@cs95的第二种方案
  • @MrNobody33 这没有帮助,它只会弄乱所有列。

标签: python


【解决方案1】:

这是使用堆栈的方式......你之前尝试过的方式 -

  1. 第 1 步 - df.stack() 仅 col1 和 col 2(以及删除 Nans),然后仅保留带有 reset_index() 的整数 将用于在下一步中合并它的索引
  2. 第 2 步 - pd.merge() 初始 DataFrame,其索引上有堆叠的 DataFrame
  3. 第 3 步 - 完成!
a = pd.DataFrame(df[['col1','col2']].stack(dropna=True),columns=['col1']).reset_index(level=1, drop=True)
pd.merge(df[['ID']],a,how='left',left_index=True, right_index=True)
    ID  col1
0   item_1  abc
1   item_2  bcd
2   item_3  NaN
3   item_4  mnb
3   item_4  lkj

如果您发现这更容易理解,请更新正确答案,以供任何找到类似解决方案的人使用。干杯!

【讨论】:

    【解决方案2】:

    这是一种方法(为了清楚起见,分多个步骤):

    df.loc[df.col1.isna() & df.col2.isna(), "keep_as_na"] = True
    df = df.melt(id_vars="ID").dropna()
    df.loc[df.variable == "keep_as_na", "value"] = np.NaN
    df.drop("variable", axis = 1).sort_values("ID")
    

    输出是:

            ID value
    0   item_1   abc
    1   item_2   bcd
    10  item_3   NaN
    3   item_4   mnb
    7   item_4   lkj
    

    【讨论】:

    • 这个比较纠结,但在我的数据上效果很好。
    • 此方法可行,但过于复杂且有很多不必要的步骤。检查我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2021-06-13
    • 2018-08-06
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多