多个csv中相同序号的数据提取并合并到新csv


前言

多个csv中有相同的ID或者序号,需要进行相同ID数据的统计

先统计一个csv的相同的ID,再获取每个ID的数据,并以ID命名存储到新的csv

再循环其他待处理的csv文件,取ID、取数据→
检查是否有相同ID的csv文件,如果没有,新建;如果有,合并(增加行)


直接撸代码

代码如下:

#!/user/bin/env python3
# -*- coding: utf-8 -*-

import os
import datetime
import pandas as pd

starttime = datetime.datetime.now()

if __name__ == '__main__':

    filenames_in = 'E:\...\col_take'  # 输入文件的文件地址
    filenames_out = 'E:\...\col_ID'  # 新文件的地址
    for files in os.walk(filenames_in):
        file = files[2]
        for i in range(len(file)):
            name = file[i]
            domain1 = os.path.abspath(filenames_in)  # 待处理文件位置
            info = os.path.join(domain1, name)  # 拼接出待处理文件名字
            print(info, "开始处理")
            df = pd.DataFrame(pd.read_csv(info, header=None, names=['**', 'id', '**','**', '**', '**', '**']))

            df_id = df[['id']]
            id_top10 = df_id.loc[:, 'id'].value_counts().head(10)  # 统计id列重复值的个数,并输出top10
            domain2 = os.path.abspath(filenames_out)  # 处理完文件保存地址
            for i in range(len(id_top10.index)):  # 不同的id循环处理
                id= id_top10 .index[i]  # 取id
                id_row = df[df['id'] == id]   # 取id所在行数据
                id_name = str(id) + '.csv'  # 生成新csv文件名
                outfo = os.path.join(domain2, id_name)  # 拼接出新文件名字
                if os.path.exists(outfo) is False:  # 判断文件是否存在
                    id_row.to_csv(outfo, header=None, index=None, encoding='utf-8')   # 不存在,创建新的csv
                else:   # 存在,合并到已有csv
                    id_exists= pd.DataFrame(pd.read_csv(outfo, header=None, names=['**', 'id', '**',
                                                                    '**', '**', '**', '**']))
                    id_new= pd.concat([id_exists, id_row ])   # 合并
                    id_new.to_csv(outfo, header=None, index=None, encoding='utf-8')   # 保存合并后的csv

            print(info, "处理完")

endtime = datetime.datetime.now()
print(endtime - starttime)


总结

最后合并的时候注意合并的内容,一开始就是没想明白,一直是outfo在和id_row合,这个是路径文件和dataframe在合并,所以一直在出错。
新手小白,简单问题笨方法,大佬请绕行。
每天进步一点点!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值