根据唯一值标记数据框
Posted
技术标签:
【中文标题】根据唯一值标记数据框【英文标题】: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.groupby
、 np.isin
或 np.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.duplicated
或 DataFrameGroupBy.duplicated
虽然...
@HarryPlotter 因为不需要。 subset
已经处理了这个... df['Unique'] = np.where(df.duplicated(subset=['PROJECT', 'ID'], keep=False), 'No', 'Yes')
@HenryEcker 哦,当然!我完全忘记了它,我很傻......我又一次把它复杂化了;)让它成为一个答案。绝对比我的好!
它发生了。我经常把事情复杂化。我喜欢 SO 的原因之一就是当我这样做时人们会提醒我。【参考方案2】:
我们可以使用 DataFrame.duplicated
和 subset
参数集来仅考虑某些列。然后我们可以将布尔值转换为'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]
)
【讨论】:
以上是关于根据唯一值标记数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 延续的数据框中将第一个唯一记录标记(标记)为 1,其余类似记录为 0