python用几行代码实现数据的按列去重及合并处理

前言:

Pandas模块是Python用于数据导入及整理的模块,对数据挖掘前期数据的处理工作十分有用
话不多说,先上pandas官方文档:

pandas官方文档
数据处理参考文档A
数据处理参考文档B

**本次将要实现的需求如下:

1.有一个Exscl表数据,该表有学员姓名 ,订单ID,ID ,以及购买的商品ID。数据格式如下:
在这里插入图片描述

2.现在要将上表处理成如下图所示格式:

在这里插入图片描述

3.代码处理逻辑主要如下:

(1)原表共有四列值,去除第二列,并且当前三列的值都一样时,去重。
(2)将第四列的值(商品ID),按照(1)步骤的合并结果,进行追加处理。(例如姓名/订单ID/ID都相同,但是商品ID不同时,就要将商品ID做追加处理)
(3)将处理后的数据,按照原表的index进行排序并保留到csv文件中。

4.代码体现:
(1)先创建一个pandas的对象,用于读取数据源Exscl的数据,生成DataFrame

import pandas as pd
import csv

df = pd.read_excel('aa.xlsx', usecols=[0,1,2,3])

usecols代表读取哪几列的数据

(2)将数据进行去重的处理,并重置索引
groupby()函数用于分组去重,三列一样则去重,三列任意一列有不同,则不去重
agg()函数处理groupby()处理的数据之外的列数据,并将列数据进行聚合,并用,分割格式化处理数据
reset_index()重置索引排序

df = df.groupby(['cUserName','订单ID','ID']).agg(lambda x:','.join(x.values)).reset_index()

(3)将处理的得到的DataFrame写入csv文件中
df.values.tolist()将拿到的所有值,转为列表形式
pop(1)表示删除列表中下标为1的数据(删除订单ID),此时返回的每一个列表,就只有三个数据值了
最后再将每次循环获得的列表值写入csv文件中

    with open('E:\\pythonScripts_autotest\\student_demo.csv', "w", newline='', encoding='GBK') as f:
        for new_list in df.values.tolist():
            new_list[0] = new_list[0].replace("@xyx2008test1", "")
            new_list[3] = str(new_list[3].split(",")).replace("'", '\\"')
            new_list.pop(1)
            writer = csv.writer(f)
            writer.writerow(new_list)

5.完整代码

import pandas as pd
import csv

#skiprowds跳过行,skiprowds跳过列,usecols读取指定列
df = pd.read_excel('E:\\pythonScripts_autotest\\xyx_student_demo.xlsx',usecols=[0,1,2,3])

# def func(df):
#     # print( ','.join(df.values))
#     return ','.join(df.values)
#
# def func_2(df):
#     return df.values

def data_list(df):
    # 分组聚合,groupby函数用于分组,三列一样则去重,三列任意一列有不同,则不去重
    # agg()函数表示处理groupuy处理的数据之外的列数据。并进行聚合
    #为什么不能直接print函数func(),因为你不用agg时,df.values拿到的是整个sheet的数据,用了agg,只返回某列数据
    #reset_index()函数用来重置索引
    df = df.groupby(['cUserName','订单ID','ID']).agg(lambda x:','.join(x.values)).reset_index()
    with open('E:\\pythonScripts_autotest\\student_demo.csv', "w", newline='', encoding='GBK') as f:
        for new_list in df.values.tolist():
            new_list[0] = new_list[0].replace("@xyx2008test1", "")
            new_list[3] = str(new_list[3].split(",")).replace("'", '\\"')
            new_list.pop(1)
            writer = csv.writer(f)
            writer.writerow(new_list)
    print("已转化成功!")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值