我有一个DataFrame如下:
index text_column
0 ,(Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1 ,Info_concern,Info_concern
2 ,color_Concern,color_Concern,no_category
3 ,reg_Concern,reg_Concern
我试图在每行中完全删除包括源值在内的重复项。
我试过了:
df['result'] = [set(x) for x in df['text_column']]
这给了我一个没有重复值的值列表,但有源值,我需要源值也被删除。
所需输出:
result
0 (concern_code),(concern_color)
1
2 no_category
3
有什么建议吗?
版本1:删除所有行的重复项:
可以用.str.split()
和.explode()
拆分和展开子串后使用带keep=False
参数的.drop_duplicates()
然后,通过行索引(级别0)上的.groupby()
将条目重新分组到它们的原始行中。最后,使用.agg()
和','.join
聚合并连接回原始同一行的子字符串
df['result'] = (df['text_column'].str.split(',')
.explode()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)
带参数keep=False
的.drop_duplicates()
确保删除包括源值在内的重复项。
或者,您也可以使用.stack()
代替.explode()
,如下所示:
df['result'] = (df['text_column'].str.split(',', expand=True)
.stack()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)
数据输入:
(从有问题的样本数据中添加了额外的测试用例:)
text_column
0 (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1 Info_concern,Info_concern
2 color_Concern,color_Concern,no_category
3 reg_Concern,reg_Concern
4 ABCDEFGHIJKL
5 ABCDEFGHIJKL
结果:
print(df)
text_column result
0 (Unable_to_see),(concern_code),(concern_color),(Unable_to_see) (concern_code),(concern_color)
1 Info_concern,Info_concern NaN
2 color_Concern,color_Concern,no_category no_category
3 reg_Concern,reg_Concern NaN
4 ABCDEFGHIJKL NaN
5 ABCDEFGHIJKL NaN
请注意,即使在不同的行中,具有相同字符串的最后2行也会作为重复项被删除。
版本2:仅删除同一行中的重复项:
如果删除重复项的范围仅限于同一行,而不是跨所有行,我们可以通过以下代码变体来实现:
df['result'] = (df['text_column'].str.split(',', expand=True)
.stack()
.groupby(level=0)
.agg(lambda x: ','.join(x.drop_duplicates(keep=False)))
)
数据输入:
(从有问题的样本数据中添加了额外的测试用例:)
text_column
0 (Unable_to_see),(concern_code),(concern_color),(Unable_to_see)
1 Info_concern,Info_concern
2 color_Concern,color_Concern,no_category
3 reg_Concern,reg_Concern
4 ABCDEFGHIJKL
5 ABCDEFGHIJKL
输出:
print(df)
text_column result
0 (Unable_to_see),(concern_code),(concern_color),(Unable_to_see) (concern_code),(concern_color)
1 Info_concern,Info_concern
2 color_Concern,color_Concern,no_category no_category
3 reg_Concern,reg_Concern
4 ABCDEFGHIJKL ABCDEFGHIJKL
5 ABCDEFGHIJKL ABCDEFGHIJKL
注意具有相同字符串的最后2行被保留,因为它们在不同的行。