pandas系列之重复值的处理

1,032 阅读5分钟

本文所用到的Excel表格内容如下:

QQ拼音截图未命名.png

1字段选择

1.1 针对整行所有字段进行重复值处理

import pandas as pd
​
df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates())

result:

    分类      书名    作者
0   历史      史记   司马迁
1   小说     红楼梦   曹雪芹
2   散文    文化苦旅   余秋雨
3   历史  明朝那些事儿  当年明月
4   漫画   半小时漫画   混子曰
5   随笔    培根随笔    培根
9   历史    资治通鉴   司马光
10  散文    行者无疆   余秋雨
11  漫画   半小时唐诗   混子曰

drop_duplicates()方法默认对所有值进行重复值判断,且默认保留首次出现的那一行的值

1.2只针对某一列进行重复值的处理

对某一列进行重复值删除时,只需使用subset参数知名要判断的列名即可

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates(subset="分类"))

result:

   分类     书名   作者
0  历史     史记  司马迁
1  小说    红楼梦  曹雪芹
2  散文   文化苦旅  余秋雨
4  漫画  半小时漫画  混子曰
5  随笔   培根随笔   培根

此时只考虑指定的列,有重复即刻删除,之余其他列是否是重复的不在考虑范围内,所以相比初始表格数据来看,第2、5、10、11行,虽然书名和作者不一样,但由于分类都是历史类。所以只保留第2行的内容。,其他重复行行的内容则被删除

1.3 针对多列进行重复值的处理

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates(subset=["分类", "作者"]))

result:

   分类      书名    作者
0  历史      史记   司马迁
1  小说     红楼梦   曹雪芹
2  散文    文化苦旅   余秋雨
3  历史  明朝那些事儿  当年明月
4  漫画   半小时漫画   混子曰
5  随笔    培根随笔    培根
9  历史    资治通鉴   司马光

此时相比初始表格数据来看,由于指定了多列,数据是否重复是要有所指定的多列的内容共同决定,而不只是单单看某一列。所以即使第2、5、10行,,虽然分类都属于历史类,但是由于书名和作者不一样,故不认为是重复记录,因此予以保留。而第4行和第9行都是余秋雨写的散文类,所以只保留了第3行的内容,第10行的内容则被删掉。

2.保留项的问题

利用Keep参数可以自定义重复值处理时的行为动作

2.1 默认情形

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates())

result:

    分类      书名    作者
0   历史      史记   司马迁
1   小说     红楼梦   曹雪芹
2   散文    文化苦旅   余秋雨
3   历史  明朝那些事儿  当年明月
4   漫画   半小时漫画   混子曰
5   随笔    培根随笔    培根
9   历史    资治通鉴   司马光
10  散文    行者无疆   余秋雨
11  漫画   半小时唐诗   混子曰

从结果可以看出, 默认情形时保留首次记录。所以相比于初始表格数据来看,第4行和第9行重复,保留第4行记录,删除第9行记录

2.2 Keep参数值为first的情形

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates(keep='first'))

result:

    分类      书名    作者
0   历史      史记   司马迁
1   小说     红楼梦   曹雪芹
2   散文    文化苦旅   余秋雨
3   历史  明朝那些事儿  当年明月
4   漫画   半小时漫画   混子曰
5   随笔    培根随笔    培根
9   历史    资治通鉴   司马光
10  散文    行者无疆   余秋雨
11  漫画   半小时唐诗   混子曰

从结果可以看出, Keep参数值为first时保留首次记录。所以相比于初始表格数据来看,第4行和第9行重复,保留第4行记录,删除第9行记录

2.3 Keep参数值为last的情形

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates(keep='last'))

result:

    分类      书名    作者
0   历史      史记   司马迁
4   漫画   半小时漫画   混子曰
5   随笔    培根随笔    培根
6   小说     红楼梦   曹雪芹
7   散文    文化苦旅   余秋雨
8   历史  明朝那些事儿  当年明月
9   历史    资治通鉴   司马光
10  散文    行者无疆   余秋雨
11  漫画   半小时唐诗   混子曰

从结果可以看出,Keep参数值为last时会保留最后一次出现的记录。所以相比于初始表格数据来看,第4行和第9行重复,保留第9行记录,删除第4行记录

2.4 Keep参数值为False的情形

df = pd.read_excel(r'C:\Users\admin\Desktop\数据分析测试表.xlsx')
print(df.drop_duplicates(keep=False))

result:

    分类     书名   作者
0   历史     史记  司马迁
4   漫画  半小时漫画  混子曰
5   随笔   培根随笔   培根
9   历史   资治通鉴  司马光
10  散文   行者无疆  余秋雨
11  漫画  半小时唐诗  混子曰

从结果可以看出,Keep参数值为last时会把所有重复值删除。所以相比于初始表格数据来看,第4行和第9行重复,那么就将这2行都删除

注:Keep参数取值只有first,last和False。没有True,不要想当然的认为有False就有True