根据唯一值标记数据框
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
我想添加标题为 'Unique' 且值为 'Yes' 或 'No' 的第三列。如果标签为 'ID' 的列中的索引值多次出现并且它们具有相同的 'PROJECT' 值,则该值必须归因于 'No',否则 'Yes'。所以我想要的结果看起来像:
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
与某种循环相结合,但还没有奏效。
按 'Project' 分组,并使用 Series.duplicated
. Then map the True values (i.e. duplicates) to 'No', and False to 'Yes' using Series.map
.
将每个组的 'ID' 重复项标记为 True
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
我们可以使用DataFrame.duplicated
with the subset
parameter set to only consider certain columns. Then we can convert the boolean values to 'Yes'
/'No'
with 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]
})
我有以下数据框:
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
我想添加标题为 'Unique' 且值为 'Yes' 或 'No' 的第三列。如果标签为 'ID' 的列中的索引值多次出现并且它们具有相同的 'PROJECT' 值,则该值必须归因于 'No',否则 'Yes'。所以我想要的结果看起来像:
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
与某种循环相结合,但还没有奏效。
按 'Project' 分组,并使用 Series.duplicated
. Then map the True values (i.e. duplicates) to 'No', and False to 'Yes' using 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
我们可以使用DataFrame.duplicated
with the subset
parameter set to only consider certain columns. Then we can convert the boolean values to 'Yes'
/'No'
with 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]
})