从熊猫数据框中删除重复行:不区分大小写的比较

Posted

技术标签:

【中文标题】从熊猫数据框中删除重复行:不区分大小写的比较【英文标题】:Remove duplicate rows from a pandas dataframe: Case Insenstive comparison 【发布时间】:2019-10-01 05:05:09 【问题描述】:

我想根据两列中的值从数据框中删除重复行:Column1Column2

如果dataframe 是:

df = pd.DataFrame('Column1': ["'cat'", "'toy'", "'cat'"],
                   'Column2': ["'bat'", "'flower'", "'bat'"],
                   'Column3': ["'xyz'", "'abc'", "'lmn'"])

关于使用:

result_df = df.drop_duplicates(subset=['Column1', 'Column2'], keep='first')
print(result_df)

我明白了:

  Column1   Column2 Column3
0   'cat'     'bat'   'xyz'
1   'toy'  'flower'   'abc'

dataframe 使用相同的代码(猫和蝙蝠的情况发生了变化)

df = pd.DataFrame('Column1': ["'Cat'", "'toy'", "'cat'"],
                   'Column2': ["'Bat'", "'flower'", "'bat'"],
                   'Column3': ["'xyz'", "'abc'", "'lmn'"])

我明白了:

  Column1   Column2 Column3
0   'Cat'     'Bat'   'xyz'
1   'toy'  'flower'   'abc'
2   'cat'     'bat'   'lmn'

预期输出:

  Column1   Column2 Column3
0   'cat'     'bat'   'xyz'
1   'toy'  'flower'   'abc'

如何进行不区分大小写的比较?

【问题讨论】:

似乎没有内置的方法可以做到这一点,通常的做法似乎是先对你的列进行大小写,然后再drop_duplicates @Nullman 但我想保留案例.. 在删除重复项之前,我认为您可以将字符串转换为小写。例如。 df['Column1'] = [c1.lower() for c1 in df['Column1']]Column1。对其他列执行相同操作。 【参考方案1】:

我想通了。创建新的大写列,然后使用它们删除重复项。完成后,删除大写列。

df = pd.DataFrame('Column1': ["'Cat'", "'toy'", "'cat'"],
                       'Column2': ["'Bat'", "'flower'", "'bat'"],
                       'Column3': ["'xyz'", "'abc'", "'lmn'"])

df['Column1_Upper'] = df['Column1'].astype(str).str.upper()
df['Column2_Upper'] = df['Column2'].astype(str).str.upper()

这给出了:

+---+---------+----------+---------+---------------+---------------+
|   | Column1 | Column2  | Column3 | Column1_Upper | Column2_Upper |
+---+---------+----------+---------+---------------+---------------+
| 0 | 'Cat'   | 'Bat'    | 'xyz'   | 'CAT'         | 'BAT'         |
| 1 | 'toy'   | 'flower' | 'abc'   | 'TOY'         | 'FLOWER'      |
| 2 | 'cat'   | 'bat'    | 'lmn'   | 'CAT'         | 'BAT'         |
+---+---------+----------+---------+---------------+---------------+

最后,运行以下命令删除重复的列和创建的列。

result_df = df.drop_duplicates(subset=['Column1_Upper', 'Column2_Upper'], keep='first')
result_df.drop(['Column1_Upper', 'Column2_Upper'], axis=1, inplace=True)
print(result_df)

这给出了:

+-----------------------------+
|   Column1   Column2 Column3 |
+-----------------------------+
| 0   'Cat'     'Bat'   'xyz' |
| 1   'toy'  'flower'   'abc' |
+-----------------------------+

【讨论】:

【参考方案2】:

您可以将数据框转换为小写,然后应用您的解决方案。

您的数据框。

df = pd.DataFrame('Column1': ["'Cat'", "'toy'", "'cat'"],
                   'Column2': ["'Bat'", "'flower'", "'bat'"],
                   'Column3': ["'xyz'", "'abc'", "'lmn'"])

print(df)

  Column1   Column2 Column3
0   'Cat'     'Bat'   'xyz'
1   'toy'  'flower'   'abc'
2   'cat'     'bat'   'lmn'

然后应用较低的字符串。

result_df = df.apply(lambda x: x.astype(str).str.lower()).drop_duplicates(subset=['Column1', 'Column2'], keep='first')

print(result_df)
  Column1   Column2 Column3
0   'cat'     'bat'   'xyz'
1   'toy'  'flower'   'abc'

然后过滤 df 为大写。

df.loc[result_df.index]

  Column1   Column2 Column3
0   'Cat'     'Bat'   'xyz'
1   'toy'  'flower'   'abc'

【讨论】:

【参考方案3】:

首先,使用以下行将所有字符串值转换为小写以使其不区分大小写:

df[['Column1', 'Column2']] = df[['Column1', 'Column2']].applymap(lambda x: x.lower())

你会得到如下输出。

Column1 Column2 Column3 0 'cat' 'bat' 'xyz' 1 'toy' 'flower' 'abc' 2 'cat' 'bat' 'lmn'

现在应用放置重复功能。

result_df = df.drop_duplicates(subset=['Column1', 'Column2'], keep='first') print(result_df)

Column1 Column2 Column3 0 'cat' 'bat' 'xyz' 1 'toy' 'flower' 'abc'

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.applymap.html

【讨论】:

以上是关于从熊猫数据框中删除重复行:不区分大小写的比较的主要内容,如果未能解决你的问题,请参考以下文章

如何根据条件表达式从熊猫数据框中删除行[重复]

FutureWarning:元素比较失败;从熊猫数据框中删除所有行时

如何从包含特定列中特定字符串的熊猫数据框中删除行? [复制]

javascript比较字符串而不区分大小写[重复]

PHP 删除重复的单词(不区分大小写)

正则表达式:匹配以“AM”结尾的单词(不区分大小写比较)[重复]