给出以下数据框:
import pandas as pd
d=pd.DataFrame({'label':[1,2,2,2,3,4,4],
'values':[3,5,7,2,5,8,3]})
d
label values
0 1 3
1 2 5
2 2 7
3 2 2
4 3 5
5 4 8
6 4 3
我知道如何计算这样的唯一值:
d['dup']=d.groupby('label')['label'].transform('count')
结果是:
label values dup
0 1 3 1
1 2 5 3
2 2 7 3
3 2 2 3
4 3 5 1
5 4 8 2
6 4 3 2
但我想要的是具有以下值的列:
1
如果每个标签列有1 unique
行,2
如果有duplicates
并且有问题的行是此first
,0
1}}如果行是原始的duplicate
。像这样:
label values dup status
0 1 3 1 1
1 2 5 3 2
2 2 7 3 0
3 2 2 3 0
4 3 5 1 1
5 4 8 2 2
6 4 3 2 0
提前致谢!
答案 0 :(得分:6)
我认为您可以将loc
与函数duplicated
创建的条件一起使用:
d['status'] = 2
d.loc[d.dup == 1, 'status'] = 1
d.loc[d.label.duplicated(), 'status'] = 0
print (d)
label values dup status
0 1 3 1 1
1 2 5 3 2
2 2 7 3 0
3 2 2 3 0
4 3 5 1 1
5 4 8 2 2
6 4 3 2 0
或加倍numpy.where
:
d['status1'] = np.where(d.dup == 1, 1,
np.where(d.label.duplicated(), 0, 2))
print (d)
label values dup status status1
0 1 3 1 1 1
1 2 5 3 2 2
2 2 7 3 0 0
3 2 2 3 0 0
4 3 5 1 1 1
5 4 8 2 2 2
6 4 3 2 0 0
答案 1 :(得分:1)
另一种选择是将计数列剪切为2,然后将duplicated
减去2次。由于duplicated
使用keep='first'
作为默认值,因此除第一个重复标签外的所有标签都将减少为零。
d['status'] = d['dup'].clip_upper(2) - 2*d.duplicated(subset='label')
结果输出:
label values dup status
0 1 3 1 1
1 2 5 3 2
2 2 7 3 0
3 2 2 3 0
4 3 5 1 1
5 4 8 2 2
6 4 3 2 0