繁体   English   中英

根据唯一值标记数据框

[英]Labeling a dataframe based on unique values

我有以下数据框:

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与某种循环结合起来,但还没有奏效。

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

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

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

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]
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM