吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2816|回复: 8
收起左侧

[Python 转载] Python利用Pandas对重复数据去重、求和问题

[复制链接]
Michael-Fade 发表于 2021-1-5 09:39
萌新一枚,恳请各位大佬帮忙看看,近期我想用groupby去重求和。我有一个疑问?每次到求和这一步,为什么列表会自动排序,导致后续替换数据时对应不上,请问各位这段代码哪个地方错了,要怎么优化,怎么才能实现我想要的结果,还请各位路过的大佬帮忙看下,网上找了两天了,都没找到解决办法[苦涩][苦涩][苦涩],谢谢啦!
萌新第一次发帖,请各位大佬多多包涵!
代码如下:


import pandas as pd
import numpy as np


data = {"number":[1,2,1,4,4,2,2,1,2,2],
"letter":['a','d','b','b','b','c','d','b','c','d'],
"label":[1,5,1,9,9,2,2,1,2,9],
"test":['大','测试','的','多个','归档','更改','回复','退货','好久','监控']}
dataset1 = pd.DataFrame(data) #初始化DataFrame 得到数据集dataset1


print(dataset1)


dataset = dataset1.fillna("NULL")
# print(dataset)


duplicate_row = dataset.duplicated(subset=['number','letter'],keep=False)
# print(duplicate_row)


duplicate_data = dataset.loc[duplicate_row,:]
print(duplicate_data)


duplicate_data_sum = duplicate_data.groupby(by=['number','letter']).agg({'label':sum}).reset_index(drop=False)
print(duplicate_data_sum)


duplicate_data_one = duplicate_data.drop_duplicates(subset=['number','letter'],keep="first").reset_index(drop=True)
print(duplicate_data_one)


no_duplicate = dataset.drop_duplicates(subset=['number','letter'] ,keep=False)
print(no_duplicate)


duplicate_data_one ['label'] = duplicate_data_sum ['label']  #前面需要重置索引
print(duplicate_data_one)


Result = pd.concat([no_duplicate,duplicate_data_one])
print(Result)

20210105093519244.jpg
20210105083630386.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| Michael-Fade 发表于 2021-1-5 10:18
大佬在哪里 帮帮孩子吧
nanceluck 发表于 2021-1-5 11:50
sz090955 发表于 2021-1-5 12:03
dataset.groupby(["number","letter"]).sum().reset_index().merge(dataset,how="left",on=["number","letter"]).drop_duplicates(subset=['number','letter'] ,keep="first")
sz090955 发表于 2021-1-5 12:12
细节请自个儿打磨,个人觉得要解决的不是排序,而是匹配
 楼主| Michael-Fade 发表于 2021-1-5 13:46
sz090955 发表于 2021-1-5 12:12
细节请自个儿打磨,个人觉得要解决的不是排序,而是匹配

好的 感谢大佬 我自己已经找到解决办法了
lvcaolhx 发表于 2021-1-5 15:17
import pandas as pd
import numpy as np


data = {"number":[1,2,1,4,4,2,2,1,2,2],
"letter":['a','d','b','b','b','c','d','b','c','d'],
"label":[1,5,1,9,9,2,2,1,2,9],
"test":['大','测试','的','多个','归档','更改','回复','退货','好久','监控']}
dataset1 = pd.DataFrame(data) #初始化DataFrame 得到数据集dataset1

dataset = dataset1.fillna("NULL")
# print(dataset)


duplicate_row = dataset.duplicated(subset=['number','letter'],keep=False)
#print(duplicate_row)


duplicate_data = dataset.loc[duplicate_row,:]
print('\n2:',duplicate_data)

'''

    直接使用 as_index=False 参数是一个好的习惯,因为如果dataframe非常巨大(比如达到GB以上规模)时,先生成一个Groupby对象,然后再调用reset_index()会有额外的时间消耗。
    在任何涉及数据的操作中,排序都是非常"奢侈的"。如果只是单纯的分组,不关心顺序,在创建Groupby对象的时候应当关闭排序功能,因为这个功能默认是开启的。尤其当你在较大的大数据集上作业时更当注意这个问题。
    值得注意的是:groupby会按照数据在原始数据框内的顺序安排它们在每个新组内的顺序。这与是否指定排序无关。

如果要得到一个多层索引的数据框,使用默认的as_index=True即可
'''

duplicate_data_sum = duplicate_data.groupby(by=['number','letter'],as_index=False, sort=False).agg({'label':sum})  #在此处能直接添加test列就更好了
print(duplicate_data_sum)


duplicate_data_one = duplicate_data.drop_duplicates(subset=['number','letter'],keep='first').reset_index(drop=True)
#print(duplicate_data_one)
#duplicate_data_one = duplicate_data.drop_duplicates(subset=['number','letter'],keep='first').reset_index(drop=True)

no_duplicate = dataset.drop_duplicates(subset=['number','letter'] ,keep=False)
#print(no_duplicate)


duplicate_data_one ['label'] = duplicate_data_sum ['label']  #前面需要重置索引
print(duplicate_data_one)


Result = pd.concat([no_duplicate,duplicate_data_one])
print(Result)

 楼主| Michael-Fade 发表于 2021-1-5 15:22
lvcaolhx 发表于 2021-1-5 15:17
import pandas as pd
import numpy as np

感谢大佬的指点
lvcaolhx 发表于 2021-1-5 15:24
初学者,一起交流进步。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表