【问题标题】:Pandas duplicate rows based on list itemsPandas 根据列表项重复行
【发布时间】:2020-07-21 17:16:25
【问题描述】:

我有一个pd.Series 的列表项。如果它们有一个或多个共同的列表项,我将两个位置定义为重复项。这个定义应该是传递的,这意味着如果位置AB是重复的,并且位置BC是重复的,那么位置AC是重复的.

例子:


In [117]: df
Out[117]: 
        A  dupe_group_ix
0  [A, B]              0
1  [D, X]              0
2     [B]              0
3  [D, A]              0
4     [A]              0

所有行都是重复的。注意01 行是重复的,因为03 行是重复的,13 行也是重复的。


In [125]: df
Out[125]: 
        A  dupe_group_ix
0  [A, B]              0
1  [D, X]              1
2     [B]              0
3  [K, D]              1
4     [A]              0

在此示例中,有两组独立的重复项。

【问题讨论】:

  • 所以这意味着所有行都是重复的?因为A0,4 索引中,B0,2 中,D1, 3 中?

标签: python python-3.x pandas duplicates


【解决方案1】:

您可以使用辅助函数来映射组 ID:

grp = {'_':-1}
def map_grp_id(x):
    grp_id = np.max([grp.get(e, -1) for e in x])
    if grp_id < 0:
        grp_id = max(grp.values())+1
        grp.update({e:grp_id for e in x})
    return grp_id

df['dupe_group_ix'] = df.A.apply(map_grp_id)

    A       dupe_group_ix
0   [A, B]              0
1   [D, X]              1
2   [B]                 0
3   [D, K]              1
4   [A]                 0

【讨论】:

  • 绝妙的解决方案!除非使用applymap 相比有速度改进,否则map(map_grp_id, na_action='ignore') 允许使用nans。另外,我建议从df.loc[df['A'].map(len, na_action='ignore').eq(0), 'A'] = np.nan; df['dupe_group_ix'] = np.nan; df['dupe_group_ix'] = df['dupe_group_ix'].astype(pd.Int64Dtype()) 开始
【解决方案2】:

@Allen 答案的改进版本,速度要快得多(150 毫秒 vs 1 分钟 46 秒),并且允许 nans 和空列。

        grp = {}

        def map_grp_id(x):
            for e in x:
                grp_id = grp.get(e, None)
                if grp_id is not None:
                    break
            else:
                grp_id = len(grp)
            grp.update({e: grp_id for e in x})
            return grp_id

        df.loc[df['A'].map(len, na_action='ignore').eq(0), 'A'] = pd.NA
        df['dupe_group_ix'] = pd.NA
        df['dupe_group_ix'] = df['dupe_group_ix'].astype(pd.Int64Dtype())
        df['dupe_group_ix'] = df[A].map(map_grp_id, na_action='ignore')

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2021-06-09
    • 2021-01-08
    • 2021-07-31
    • 2021-12-06
    相关资源
    最近更新 更多