这是一个相当简单的查询,但是我没有找到与查询相关的解决方案。我必须基于多个列来识别重复项。不同的是,一列可以在一行中包含多个值,因此需要将其视为单独的值。
示例:
dct ={'store':('A','A','A','A','A','B','B','B','C','C','C','C'),
'station':('aisle','aisle','aisle','window','window','aisle','aisle','aisle','aisle','window','window','window'),
'produce':('apple','apple','cherry, apple','orange','orange','apple','apple,orange','orange','apple','apple','apple','orange')}
df = pd.DataFrame(dct)
print(df)
store station produce
0 A aisle apple
1 A aisle apple
2 A aisle cherry, apple
3 A window orange
4 A window orange
5 B aisle apple
6 B aisle apple,orange
7 B aisle orange
8 C aisle apple
9 C window apple
10 C window apple
11 C window orange
预期数据框:
store station produce result
A aisle apple False
A aisle apple False
A aisle cherry,apple False
A window orange True
A window orange True
B aisle apple False
B aisle apple,orange False
B aisle orange False
C aisle apple True --> not duplicated; 'station' is diff
C window apple False
C window apple False
C window orange True
我一直在使用df.duplicated(subset=['store','station','produce'], keep=False)
但是它会丢失一行中有多个值的数据,您知道如何解决吗?
可选添加:
类似的功能,例如“保持”(确定要标记的重复项(如有)),首先/最后/错误
最后一部分是完全可选的,不是必须的:-)
答案 0 :(得分:2)
您可以使用series.str.split
创建唯一商品列表,并使用df.explode
根据需要添加新行,然后检查重复项。
df.produce = df.produce.str.split(',')
df = df.explode('produce')
df['result'] = df.duplicated(
subset=['store', 'station', 'produce'],
keep=False)
输出
store station produce result
0 A aisle apple True
1 A aisle apple True
2 A aisle cherry False
2 A aisle apple False
3 A window orange True
4 A window orange True
5 B aisle apple True
6 B aisle apple True
6 B aisle orange True
7 B aisle orange True
8 C aisle apple False
9 C window apple True
10 C window apple True
11 C window orange False
答案 1 :(得分:2)
让我们做
df['New'] = df.assign(produce=df['produce'].str.split(', ')).\
explode('produce').\
duplicated(subset=['store', 'station', 'produce'], keep=False).any(level=0)
Out[160]:
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 True
8 False
9 True
10 True
11 False
dtype: bool