【问题标题】:Labeling a dataframe based on unique values根据唯一值标记数据框
【发布时间】:2021-12-24 10:48:14
【问题描述】:

我有以下数据框:

x=df[['PROJECT','ID']] 
print(x)



        PROJECT       ID
0           1         10
1           1         32
2           1         32
3           1          9
4           1         32
5           1         10
6           2         10
7           2         33
8           2         54
9           2          9
10          2         31
11          2         10
12          3         10
13          3         54
14          3         53
15          3         11
16          3         33
17          3         54

我想添加标题为“唯一”的第三列,其值为“是”或“否”。如果带有标签“ID”的列中的索引值多次出现并且它们具有相同的“PROJECT”值,则必须将该值归为“否”,否则为“是”。所以我想要的结果是这样的:

         PROJECT       ID     Unique
0           1         10      No
1           1         32      No
2           1         32      No
3           1          9      Yes
4           1         32      No
5           1         10      No
6           2         10      No
7           2         33      Yes
8           2         54      Yes
9           2          9      Yes
10          2         31      Yes
11          2         10      No
12          3         10      Yes
13          3         54      No
14          3         53      Yes
15          3         11      Yes
16          3         33      Yes
17          3         54      No

您基本上必须将具有相同 PROJECT 值的行视为一个子集,您必须为其确定相应 ID 值的唯一性。 'PROJECT' 值不同的行没有连接。我尝试了几件事,将 np.groupbynp.isinnp.unique 与某种循环结合起来,但它还没有奏效。

【问题讨论】:

    标签: python pandas dataframe group-by unique


    【解决方案1】:

    按“项目”分组,并为每个组使用Series.duplicated 将“ID”重复项标记为 True。然后使用 Series.map 将 True 值(即重复值)映射到“否”,将 False 映射到“是”。

    df['Unique'] = (
        df.groupby('PROJECT')['ID']
          .apply(lambda g: g.duplicated(keep=False))
          .map({True:'No', False:'Yes'})
    )
    
    >>> df
    
        PROJECT  ID Unique
    0         1  10     No
    1         1  32     No
    2         1  32     No
    3         1   9    Yes
    4         1  32     No
    5         1  10     No
    6         2  10     No
    7         2  33    Yes
    8         2  54    Yes
    9         2   9    Yes
    10        2  31    Yes
    11        2  10     No
    12        3  10    Yes
    13        3  54     No
    14        3  53    Yes
    15        3  11    Yes
    16        3  33    Yes
    17        3  54     No
    

    【讨论】:

    • .duplicated 真是天才……
    • @user17242583 谢谢 ;) 我不明白为什么没有 SeriesGroupBy.duplicatedDataFrameGroupBy.duplicated虽然...
    • @HarryPlotter 因为不需要。 subset 已经处理了这个... df['Unique'] = np.where(df.duplicated(subset=['PROJECT', 'ID'], keep=False), 'No', 'Yes')
    • @HenryEcker 哦,当然!我完全忘记了它,我很傻......我又一次把它复杂化了;)让它成为一个答案。绝对比我的好!
    • 它发生了。我经常把事情复杂化。我喜欢 SO 的原因之一就是当我这样做时人们会提醒我。
    【解决方案2】:

    我们可以使用 DataFrame.duplicatedsubset 参数集来仅考虑某些列。然后我们可以将布尔值转换为'Yes'/'No'np.where

    df['Unique'] = np.where(
        df.duplicated(subset=['PROJECT', 'ID'], keep=False), 'No', 'Yes'
    )
    

    df:

        PROJECT  ID Unique
    0         1  10     No
    1         1  32     No
    2         1  32     No
    3         1   9    Yes
    4         1  32     No
    5         1  10     No
    6         2  10     No
    7         2  33    Yes
    8         2  54    Yes
    9         2   9    Yes
    10        2  31    Yes
    11        2  10     No
    12        3  10    Yes
    13        3  54     No
    14        3  53    Yes
    15        3  11    Yes
    16        3  33    Yes
    17        3  54     No
    

    设置:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({
        'PROJECT': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3],
        'ID': [10, 32, 32, 9, 32, 10, 10, 33, 54, 9, 31, 10, 10, 54, 53, 11, 33, 54]
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2021-10-30
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多