文章大概的解决的需求是,要对某一列(下文以“办理人id”为例)进行去重,并且要优先保留另外一列(下文以““事项名称””为例)计数较少的。
适用于数据的清洗,对数据进行条件去重
全部代码如下
import pandas as pd
from functools import reduce # 用于多表关联合并
df=pd.DataFrame(data=[['A事项',5],
['B事项',10],
['C事项',8],
['A事项',3],
['A事项',7],
['B事项',10],
['B事项',8],
['A事项',3],
['A事项',7],
],
columns = ['事项名称','办理人id'],)
df_count=df['事项名称'].value_counts().rename_axis('事项名称').reset_index(name="事项名称的个数")
#把“事项名称”的频数带入到原始表
df=[df, df_count]
df2 = reduce(lambda left,right: pd.merge(left,right,on=['事项名称'],how='left'), df)
#排序
df3=df2.sort_values(by=['事项名称的个数','事项名称'],ascending= [True,True])
#去重
df4=df3.drop_duplicates(subset= '办理人id', keep='first', inplace=False)
下面是对代码简单解释补充
先导入一组数,需求是要计算字段“事项名称”出现的总次数,并且在df新增一列,把计数结果放入
import pandas as pd
from functools import reduce # 用于多表关联合并
df=pd.DataFrame(data=[['A事项',5],
['B事项',10],
['C事项',8],
['A事项',3],
['A事项',7],
['B事项',10],
['B事项',8],
['A事项',3],
['A事项',7],
],
columns = ['事项名称','办理人id'],)
得到的数据格式如下
事项名称 | 办理人id | |
---|---|---|
0 | A事项 | 5 |
1 | B事项 | 10 |
2 | C事项 | 8 |
3 | A事项 | 3 |
4 | A事项 | 7 |
5 | B事项 | 10 |
6 | B事项 | 8 |
7 | A事项 | 3 |
8 | A事项 | 7 |
先用value_counts()计数,并且转换为dataframe的格式
#统计“事项名称”的频数
df_count=df['事项名称'].value_counts().rename_axis('事项名称').reset_index(name="事项名称的个数")
事项名称 | 事项名称的个数 | |
---|---|---|
0 | A事项 | 5 |
1 | B事项 | 3 |
2 | C事项 | 1 |
把得到的计数结果放到原来的数据表中
#把“事项名称”的频数放入到df中
df=[df, df1_count]
df2 = reduce(lambda left,right: pd.merge(left,right,on=['事项名称'],how='left'), df)
得到的df2结果如下,发现最右边已经新增了一列“事项名称的个数”
事项名称 | 办理人id | 事项名称的个数 | |
---|---|---|---|
0 | A事项 | 5 | 5 |
1 | B事项 | 10 | 3 |
2 | C事项 | 8 | 1 |
3 | A事项 | 3 | 5 |
4 | A事项 | 7 | 5 |
5 | B事项 | 10 | 3 |
6 | B事项 | 8 | 3 |
7 | A事项 | 3 | 5 |
8 | A事项 | 7 | 5 |
然后对“事项名称的个数”进行排序,根据自己的需求,把“事项名称的个数”频数较少的排列在前面
# 排序
df3=df2.sort_values(by=['事项名称的个数','事项名称'],ascending= [True,True])
得到的df3结果如下,发现“事项名称的个数”这一列已经从高到低进行了排序
事项名称 | 办理人id | 事项名称的个数 | |
---|---|---|---|
2 | C事项 | 8 | 1 |
1 | B事项 | 10 | 3 |
5 | B事项 | 10 | 3 |
6 | B事项 | 8 | 3 |
0 | A事项 | 5 | 5 |
3 | A事项 | 3 | 5 |
4 | A事项 | 7 | 5 |
7 | A事项 | 3 | 5 |
8 | A事项 | 7 | 5 |
接着删除id重复的情况:由于前面的排序是把计数少的在前面,为了尽可能的保留计数少的,所以我们去重的时候要优先保留第一个,也就是下面的keep='first'
df4=df3.drop_duplicates(subset= '办理人id', keep='first', inplace=False)
df4结果如下,删除重复id之后,已经优先保留了“事项名称”的中频数较少的“C事项”
事项名称 | 办理人id | 事项名称的个数 | |
---|---|---|---|
2 | C事项 | 8 | 1 |
1 | B事项 | 10 | 3 |
0 | A事项 | 5 | 5 |
3 | A事项 | 3 | 5 |
4 | A事项 | 7 | 5 |
本人是python小白,欢迎大家多多提问。如果有更好的的法子,也希望大家可以指导指导我