Pandas优先保留某一列频数少,然后再对另外一列进行去重

         文章大概的解决的需求是,要对某一列(下文以“办理人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
0A事项5
1B事项10
2C事项8
3A事项3
4A事项7
5B事项10
6B事项8
7A事项3
8A事项7

先用value_counts()计数,并且转换为dataframe的格式

#统计“事项名称”的频数
df_count=df['事项名称'].value_counts().rename_axis('事项名称').reset_index(name="事项名称的个数")
事项名称事项名称的个数
0A事项5
1B事项3
2C事项1

把得到的计数结果放到原来的数据表中

#把“事项名称”的频数放入到df中
df=[df, df1_count]
df2 = reduce(lambda left,right: pd.merge(left,right,on=['事项名称'],how='left'), df)

得到的df2结果如下,发现最右边已经新增了一列“事项名称的个数”

事项名称办理人id事项名称的个数
0A事项55
1B事项103
2C事项81
3A事项35
4A事项75
5B事项103
6B事项83
7A事项35
8A事项75

然后对“事项名称的个数”进行排序,根据自己的需求,把“事项名称的个数”频数较少的排列在前面

# 排序
df3=df2.sort_values(by=['事项名称的个数','事项名称'],ascending= [True,True])

得到的df3结果如下,发现“事项名称的个数”这一列已经从高到低进行了排序

事项名称办理人id事项名称的个数
2C事项81
1B事项103
5B事项103
6B事项83
0A事项55
3A事项35
4A事项75
7A事项35
8A事项75

接着删除id重复的情况:由于前面的排序是把计数少的在前面,为了尽可能的保留计数少的,所以我们去重的时候要优先保留第一个,也就是下面的keep='first'

df4=df3.drop_duplicates(subset= '办理人id', keep='first', inplace=False)

df4结果如下,删除重复id之后,已经优先保留了“事项名称”的中频数较少的“C事项”

事项名称办理人id事项名称的个数
2C事项81
1B事项103
0A事项55
3A事项35
4A事项75

本人是python小白,欢迎大家多多提问。如果有更好的的法子,也希望大家可以指导指导我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值