将csv中根据某列重复数据将整行删除

项目场景:

目前对接需求,是要根据某列重复数据,将重复数据整行删除。其中将会遇到一个小问题,批量文件编码会有问题,可能出现非utf-8编码


解决方案

首先遇到这个问题,我们首先需要将所给的CSV表格批量全部转成utf-8编码,这里我是通过小工具批量进行转换,软件名称叫做TextEncoding,之后我们在进行需求实现。
第一步:
首先将在.py同一级别下创建inputcsv文件夹,将批量全部转成utf-8编码的CSV放入其中,循环读取里面文件名

osfile = []
dir = r"./inputcsv/"
for root, dirs, files in os.walk(dir):
    for file in files:
        if file.split('.')[1] == 'csv':
            osfile.append(file)
print(osfile)
print("+++++++++++++++++++++++++++++")

因为需求中每个CSV文件夹里面age所在列不同,表现形式不同有的是写程ages,ages(MA),AGE这种,所有需要动态找到标签所在的列因此代码为:`

ageint = -1
    for index in range(len(content[0])):
        if content[0][index].lower().find('age')!=-1:#头标签全部转换的小写,再找age在哪列
            ageint=index
    if ageint != -1:
        print("age在第X列"+str(ageint))
        # 将age这列单独存放
        ages = []
        for indexage in range(1,len(content)):
            # print(content[indexage][ageint])
            ages.append(content[indexage][ageint])
        print(ages)
        print("+++++++++++++++++++++++++++++")

将age放入到一个数组里面用一个前后值比较找到重复的数值,将该数值下标存入到列表中,因为存在多个重复原因,因此进一步将重复数值下标从低到高排序,这样得到一个要删除的重复值下标列表。

 # 将所有重复的数字下标都存在一个数组里面
        congfutest = []
        congfu = []
        for i in range(0, len(ages)):
            for j in range(i + 1, len(ages)):
                if ages[i] == ages[j]:
                    congfutest.append(j)
        print(congfutest)
        print("=================================")
        seen = set()
        for item in congfutest:
            if item not in seen:
                seen.add(item)
                congfu.append(item+1)# 加上第一行标签行
        print(congfu)
        congfu.sort()# 排序
        print(congfu)

最后删除重复值存入到自定的一个同级py的一个文件夹。

 for counter, index in enumerate(congfu):
            index = index - counter
            content.pop(index)
        for index in range(len(content)):
            print(content[index])
        with open('./outputcsv/'+osfile[indexFile].split('.')[0]+'.csv', "w",encoding='utf-8', newline="") as csvfile:
            writer = csv.writer(csvfile)
            # 先写入columns_name
            writer.writerow(content[0])
            # 写入多行用writerows
            for index in range(1,len(content)):
                writer.writerow(content[index])
            print(osfile[indexFile].split('.')[0]+'.csv'+ "保存成功")

整体代码

import csv
import os
import pandas as pd
import numpy as np
osfile = []
dir = r"./inputcsv/"
for root, dirs, files in os.walk(dir):
    for file in files:
        if file.split('.')[1] == 'csv':
            osfile.append(file)
print(osfile)
print("+++++++++++++++++++++++++++++")
for indexFile in range(len(osfile)):
    csv_file=csv.reader(open('./inputcsv/'+osfile[indexFile],'r',encoding='utf-8'))
    print(osfile[indexFile].split('.')[0]+'.csv'+ "开始")
    content=[] #用来存储整个文件的数据,存成一个列表,列表的每一个元素又是一个列表,表示的是文件的某一行
    for line in csv_file:
        if line:
            content.append(line)
    # print(content[0])
    # 确定Age这列所在的位置
    ageint = -1
    for index in range(len(content[0])):
        if content[0][index].lower().find('age')!=-1:#头标签全部转换的小写,再找age在哪列
            ageint=index
    if ageint != -1:
        print("age在第X列"+str(ageint))
        # 将age这列单独存放
        ages = []
        for indexage in range(1,len(content)):
            # print(content[indexage][ageint])
            ages.append(content[indexage][ageint])
        print(ages)
        print("+++++++++++++++++++++++++++++")
        # 将所有重复的数字下标都存在一个数组里面
        congfutest = []
        congfu = []
        for i in range(0, len(ages)):
            for j in range(i + 1, len(ages)):
                if ages[i] == ages[j]:
                    congfutest.append(j)
        print(congfutest)
        print("=================================")
        seen = set()
        for item in congfutest:
            if item not in seen:
                seen.add(item)
                congfu.append(item+1)# 加上第一行标签行
        print(congfu)
        congfu.sort()# 排序
        print(congfu)
        # 删除重复的行
        for counter, index in enumerate(congfu):
            index = index - counter
            content.pop(index)
        for index in range(len(content)):
            print(content[index])
        with open('./outputcsv/'+osfile[indexFile].split('.')[0]+'.csv', "w",encoding='utf-8', newline="") as csvfile:
            writer = csv.writer(csvfile)
            # 先写入columns_name
            writer.writerow(content[0])
            # 写入多行用writerows
            for index in range(1,len(content)):
                writer.writerow(content[index])
            print(osfile[indexFile].split('.')[0]+'.csv'+ "保存成功")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 pandas 可以使用 `set_index()` 方法来将一列设置为主键。例如,如果你有一个名为 `df` 的数据框,并且想将 'ID' 列设置为主键,可以这样做: ``` df = df.set_index('ID') ``` 如果您不想将原始数据框更改,可以使用.copy()来进行复制 ``` df2 = df.set_index('ID').copy() ``` 还可以在读取文件时设置主键,比如读取csv ``` df = pd.read_csv("data.csv", index_col='ID') ``` 如果你想将多列设置为主键,可以使用列表传递给 `set_index()`,例如: ``` df = df.set_index(['col1', 'col2']) ``` ### 回答2: 在pandas,可以使用set_index函数来为数据框创建主键。 set_index函数用于设置一列或多列作为数据框的索引,从而创建主键。可以传递列名字符串或列名列表作为参数。以下是一个示例: ``` import pandas as pd # 创建一个包含多个列的数据框 data = {'姓名': ['张三', '李四', '王五'], '年龄': [25, 30, 35], '性别': ['男', '女', '男']} df = pd.DataFrame(data) # 使用set_index函数创建主键 df = df.set_index('姓名') print(df) ``` 这段代码,我们首先创建了一个包含“姓名”、“年龄”和“性别”三列的数据字典,并使用pd.DataFrame函数将其转换为数据框。然后,我们使用set_index函数将“姓名”列作为主键,也就是将其设置为索引。最后,通过打印数据框,我们可以看到“姓名”列已成为主键。 set_index函数还支持使用多列作为主键。如果想要将多列作为主键,只需将列名组成的列表作为set_index函数的参数即可。例如,使用以下代码可以将“姓名”和“年龄”两列作为主键: ``` df = df.set_index(['姓名', '年龄']) ``` 在此示例,我们将“姓名”和“年龄”两列组成的列表作为set_index函数的参数,从而将这两列作为主键。通过执行这行代码后,数据框的索引将显示为由“姓名”和“年龄”两列组成的多级索引。 ### 回答3: Pandas是一个流行的数据分析库,可以使用它来创建和处理数据框。在Pandas,可以使用一列或多列来创建主键。 创建主键的第一步是加载数据。可以使用Pandas的`read_csv()`函数从CSV文件加载数据,或者使用`read_excel()`函数从Excel文件加载数据。加载数据后,可以使用`head()`函数查看前几行数据,确保数据正确加载。 创建主键的第二步是选择一列或多列作为主键。可以使用`set_index()`函数来选择列作为主键。例如,如果我们想把"ID"列作为主键,可以使用以下代码: ``` df.set_index("ID", inplace=True) ``` 其,`df`是数据框的名称,"ID"是想要设置为主键的列名。 创建主键的第三步是确保主键的唯一性。可以使用`duplicated()`函数来检查是否存在重复主键。如果存在重复主键,可以使用`drop_duplicates()`函数删除重复记录。例如,可以使用以下代码删除重复记录: ``` df.drop_duplicates(inplace=True) ``` 这将删除整行数据重复的记录,保留唯一的主键。 创建主键的最后一步是确保主键的完整性。这意味着主键的值不能为null或缺失。可以使用`dropna()`函数删除包含缺失值的行。例如,可以使用以下代码删除包含缺失值的行: ``` df.dropna(inplace=True) ``` 这将删除整行数据包含缺失值的记录,确保主键的完整性。 通过以上步骤,就可以成功地创建一个带有主键的Pandas数据框。可以使用`head()`函数再次查看数据,确保主键已经被正确设置。现在,数据的记录将根据所选择的列的值进行唯一标识,并且保证没有重复或缺失值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经常喝假酒的胡小臣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值