【问题标题】:Python: merge duplicates by unique column in CSVPython:按CSV中的唯一列合并重复项
【发布时间】:2021-04-27 20:58:13
【问题描述】:

我的 python 代码有问题。我正在尝试合并数据框中的行。我有类似的东西:

CODE_ID SIZE 1 2 3 4 ... 18 CODE
12345 Big X . . . ... . abc
12345 Big . X . . ... . def
67890 Medium . . . X ... . ghi
67890 Medium . . X . ... . jkl
13579 Small . . . X ... . xyz

我想按 CODE_ID 合并重复项,但我想加入 CODE 列中的字符串。就这样:

CODE_ID SIZE 1 2 3 4 ... 18 CODE
12345 Big X X . . ... . abc; def
67890 Medium . . X X ... . ghi; jkl
13579 Small . . . X ... . xyz

我是用 agg 做的,但这只是工作的一部分。

g_df = df.groupby("CODE_ID")
group = g_df["CODE"].agg(lambda column: "; ".join(column))
group = group.reset_index(name="CODE")

因为结果是这样的:

CODE_ID CODE
12345 abc; def
67890 ghi; jkl
13579 xyz

如何添加其余列?或者也许这是错误的做法?

【问题讨论】:

    标签: python pandas dataframe aggregate unique


    【解决方案1】:

    您可以将Xs 和.s 转换为1/0,然后将groupbymax 映射回Xs 和.s:

    (df
         .set_index(['CODE_ID', 'SIZE'])
         .filter(regex='\d+')              # numeric column names
         .replace({'X': 1, '.': 0})        # map to 1/0s
         .groupby(level=[0, 1])            # groupby code and size
         .max()                            # max
         .replace({1: 'X', 0: '.'})        # map back to X/.
    ).merge(                               # add ;-separated codes
        df.groupby(['CODE_ID', 'SIZE'])["CODE"].apply('; '.join),
        left_index=True,
        right_index=True,
    )
    

    输出:

       CODE_ID    SIZE  1  2  3  4 18      CODE
    0    12345     Big  X  X  .  .  .  abc; def
    1    13579   Small  .  .  .  X  .       xyz
    2    67890  Medium  .  .  X  X  .  ghi; jkl
    

    【讨论】:

      猜你喜欢
      • 2019-04-02
      • 2012-04-13
      • 1970-01-01
      • 2020-03-28
      • 2012-10-04
      • 2018-10-23
      • 2018-06-27
      • 1970-01-01
      • 2015-05-17
      相关资源
      最近更新 更多