首页 > 解决方案 > 查找重复项并标记为变体

问题描述

我正在尝试创建一个数据框,在其中将重复项添加为列中的变体。为了进一步说明我的问题:

我有一个像这样的熊猫数据框:

    Case    ButtonAsInteger
0   1       130
1   1       133
2   1       42
3   2       165
4   2       158
5   2       157
6   3       158
7   3       159
8   3       157
9   4       130
10  4       133
11  4       43
... ...     ...

我已将其转换为这种形式:

grouped = activity2.groupby(['Case'])
values = grouped['ButtonAsInteger'].agg('sum')
id_df = grouped['ButtonAsInteger'].apply(lambda x: pd.Series(x.values)).unstack(level=-1


        0       1       2       3       4       5       6       7       8       9
Case                                                                                    
1       130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN
2       165.0   158.0   157.0   141.0   142.0   142.0   142.0   142.0   142.0   147.0
3       158.0   159.0   157.0   147.0   166.0   170.0   169.0   130.0   133.0   133.0
4       130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN

现在我想找到重复项并将每个重复项标记为一个变体。所以在这个例子中,案例 1 和 4 应该得到变体 1。像这样:

        Variants    0       1       2       3       4       5       6       7       8       9
Case                                                                                        
1       1           130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN
2       2           165.0   158.0   157.0   141.0   142.0   142.0   142.0   142.0   142.0   147.0
3       3           158.0   159.0   157.0   147.0   166.0   170.0   169.0   130.0   133.0   133.0
4       1           130.0   133.0   42.0    52.0    47.0    47.0    32.0    94.0    NaN     NaN

我已经尝试过这种方法https://stackoverflow.com/a/44999009。但它不适用于我的数据框。不幸的是我不知道为什么。

可能可以应用双 for 循环。因此,对于每一行,查看记录中是否存在重复项。我不知道这对大型记录是否有效。

我还添加了我的分组程序,因为此时可能已经使用重复项了?

标签: pythonpandasnumpydataframeduplicates

解决方案


这按所有列分组并返回组索引(+ 1,因为基于零的索引是默认值)。我认为这应该是你想要的。

id_df['Variant'] = id_df.groupby(
    id_df.columns.values.tolist()).grouper.group_info[0] + 1

给定上面的输入数据,生成的数据框:

        0    1    2  Variant
Case                        
1     130  133   42        1
2     165  158  157        3
3     158  159  157        2
4     130  133   42        1

访问组索引可能有一种语法上更好的方法,但我没有找到。


推荐阅读