【问题标题】:Python - preserve differing values in new column for near duplicate rows then delete duplicatesPython - 在新列中为接近重复的行保留不同的值,然后删除重复项
【发布时间】:2020-06-08 14:34:12
【问题描述】:

我有一个 pandas 数据框,它是其中 1 列创建重复行的查询的结果。我需要帮助按名称识别重复项的非重复值,然后动态创建具有所有值的新列,然后删除重复项。 Mike 下面的“代码”列中有重复项,“Lang”列中有标记,所以我希望每行都有一个新列用于非重复值。

 ID |  Name  |  Code  |  Lang  |
 1  |  Mike  |   25   |   SQL  |
 1  |  Mike  |   26   |   SQL  |
 1  |  Mike  |   27   |   SQL  |
 2  |  Mark  |   39   |  NoSQL |
 2  |  Mark  |   39   |   SQL  |

循环并确定哪些列不重复,复制不重复的值,写入第一个接近重复行的新列,删除重复。

 ID |  Name  |  Code  |  Code2 |  Code3 |  Lang  | Lang2 |
 1  |  Mike  |   25   |   26   |   27   |   SQL  |   .   |
 2  |  Mark  |   39   |    .   |    .   |  NoSQL |  SQL  |

我可以使用以下内容仅获取重复的行,但是我进行了大量研究并且无法获取我的结果。我正在探索枢轴和融化作为一种​​选择,但被困在动态列部分。

dup_rows = orig_df[orig_df.duplicated(['Name'])]

【问题讨论】:

  • 您需要特定输出是否有特殊原因?一般来说,我发现宽数据更难处理,而且会占用更多空间。上面的操作绝对不是微不足道的。
  • 我有很多由我想保留为新列的几列生成的重复项。在大多数情况下,它是一两个重复项,并且只有 1-2 列,因此不会变得太宽。我可以在 SAS 中相当容易地做到这一点,但后来改用 python。我也研究过用 SQL 编写它,但认为 python 将具有相当容易做到这一点的函数。我可以忍受这不是动态的,并确定哪些列产生了重复项并仅解决这些问题。

标签: python pandas dataframe duplicates


【解决方案1】:

我们可以用GroupByduplicatedcumsum 标记每个组的重复项 然后使用pivot_table 将行转为列,最后我们使用pd.concat 获取单个数据帧:

columns = ['Code', 'Lang']
dfs = []

for col in columns:
    df['cols'] = (
        col + df.groupby(['ID', 'Name'], sort=False)
                .apply(lambda x: (~x[col].duplicated()).cumsum()).astype(str).to_numpy()
    )
    dfs.append(df.pivot_table(index=['ID', 'Name'], columns='cols', values=col, aggfunc='first'))

dfn = pd.concat(dfs, axis=1).reset_index().rename_axis(None, axis=1)

   ID  Name  Code1  Code2  Code3  Lang1 Lang2
0   1  Mike   25.0   26.0   27.0    SQL   NaN
1   2  Mark   39.0    NaN    NaN  NoSQL   SQL

【讨论】:

  • 为简单起见,我从我的真实 df 中包含了一个总结示例。在我的 df 中,我有大约 40 列具有不同的 dtypes。当我只包含我想将值写入新列 ['Code', 'Lang'] 的两列时,它不适用于我的整个 df。当我在 df.groupby 中包含所有其他列时,由于我拥有的各种 dtypes 我收到此错误 = TypeError: ufunc 'add' did not contain a loop with signature matching types dtype(' 。我将尝试拆分df,应用上述内容并合并。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2021-12-29
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2019-10-27
  • 2021-09-24
相关资源
最近更新 更多