【问题标题】:Creating a unique id based on combinations of columns (ignoring order)根据列的组合创建唯一 ID(忽略顺序)
【发布时间】:2023-02-25 04:39:17
【问题描述】:

设想

想象一个数据集是某个过程的结果。数据集包含两个 id 列,id1id2,表示部分数据在前面的过程中来自哪里。两个 id 列可以是 int 或 string。我想根据存在的 id 创建一个唯一的 id两个都其中是专栏。但是,id 的顺序并不重要.例如:

id1 == Aid2 == NaNid1 == NaNid2==A 相同,因为存在的唯一“真实”ID 是A。 id 值可以是单个字母、数字或字符串。

测试数据

>>> import pandas as pd
>>> import numpy as np
>>> df = pd.DataFrame({'id1': ['A', np.nan, 'A'], 'id2': [np.nan, 'B', 'B']})
>>> df
   id1  id2
0    A  NaN
1  NaN    B
2    B    B

核心问题

当排序不重要时,如何使用 pandas 和 numpy 函数基于 id1 和 id2 的组合创建一个唯一的 id?

其他相关回答

In Pandas, how to create a unique ID based on the combination of many columns?

Grouping by multiple columns to find duplicate rows pandas

我试过的事情

  • 将 id1 和 id2 强制转换为字符串,组合、排序和删除重复项(有效但很混乱)
  • pd.factorize: 看起来比上面的好,但仍然需要 id1 和 id2 的组合和排序

期望的输出

>>> df
   id1  id2  combined_id
0    A  NaN  A
1  NaN    B  B
2    A    B  AB
3  NaN  NaN  NaN

【问题讨论】:

  • B A 会是 AB 吗,因为顺序并不重要,还是会是 BA

标签: python pandas dataframe


【解决方案1】:

在您的数据中添加了一行B A

(df.reset_index().melt('index').dropna().sort_values('value')
   .groupby('index').agg({'value':''.join}))
 
      value
index      
0         A
1         B
2        AB
3        AB

【讨论】:

    【解决方案2】:

    最简单的方法是:

    df['combinedid'] = df['id1']+ df['id2']
    

    结果:

    id1 id2 combinedid
    0 A
    1 B
    2 A B AB

    删除后钠盐价值观:

    df = df.fillna("")
    df['combinedid'] = df['id1']+ df['id2']
    

    结果:

    id1 id2 combinedid
    0 A A
    1 B B
    2 A B AB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多