如何使用 pandas python 从列表中完全删除重复的字符串?
How to remove the duplicate string completely from the list using pandas python?
我有一个 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:删除所有行中的重复项:
您可以使用 .drop_duplicates()
with parameter keep=False
after splitting and expanding the substrings by .str.split()
and .explode()
.
然后,通过 .groupby()
on the row index (level 0). Finally, aggregate and join back the substrings of the original same row with .agg()
和 ','.join
将条目重新分组到它们的原始行中
df['result'] = (df['text_column'].str.split(',')
.explode()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)
.drop_duplicates()
和参数 keep=False
确保删除重复项,包括源值。
或者,你也可以用.stack()
in place of .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
请注意保留最后两行相同的字符串,因为它们在不同的行中。
我有一个 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:删除所有行中的重复项:
您可以使用 .drop_duplicates()
with parameter keep=False
after splitting and expanding the substrings by .str.split()
and .explode()
.
然后,通过 .groupby()
on the row index (level 0). Finally, aggregate and join back the substrings of the original same row with .agg()
和 ','.join
df['result'] = (df['text_column'].str.split(',')
.explode()
.drop_duplicates(keep=False)
.groupby(level=0).agg(','.join)
)
.drop_duplicates()
和参数 keep=False
确保删除重复项,包括源值。
或者,你也可以用.stack()
in place of .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
请注意保留最后两行相同的字符串,因为它们在不同的行中。