合并csv中的重复数据单元格

数据挖掘 Python CSV
2022-01-27 10:32:52

我有一个大约 100 万行的 CSV 文件。可以说它的细节如下

Name      |   Age   | Salary 
name 1      52       10000
name 2      55       10043 
name 3      50       100054
name 2      55       10023
name 1      52       100322...

等等 。

但我需要合并多余的细节。并且需要像这样的输出

Name      |   Age   | Salary 
name 1      52       110322*
name 2      55       20066 *
name 3      50       100054 

您可能会注意到重复的名称 1 和名称 2 详细信息已合并,并且工资值已添加。所以我正在寻找一种方法将此更改应用于我的原始数据集。所以我需要一个 python 脚本来解决我的问题。

3个回答

Pandas是一个 Python 库,您会发现它对这些类型的任务非常有用。

这是一个堆栈溢出帖子,它告诉您如何做您想要完成的事情。

它归结为三个非常pythonic的行,其中包含groupby 和转换,然后是drop_duplicates

import pandas
df = pandas.read_csv('csvfile.csv', header = 0)
df['Total'] = df.groupby(['Name', 'Age'])['Salary'].transform('sum')
df.drop_duplicates(take_last=True)

我的解决方案可能不是最好的,但我会选择这个,因为它是最简单的。

  • 创建一个空字典
  • 迭代 CSV。如果名字已经在字典里,总结一下薪水。如果没有,则使用薪水创建一个新密钥。
  • 之后,再次在字典上迭代以使用新值写入新的 CSV。

如果你不熟悉 Python 代码,问它,我会为你写的:)

使用代码示例进行编辑:

import csv

## open CSV file and rea it
myfile  = open('test.csv', "rb")
reader = csv.reader(myfile)

## create an empty dictionary
mydictionary = {}

rownum = 0

for row in reader:
    ## check if it is the header
    if rownum == 0:
        pass
    else:
        ## split the line of CSV in elements..Use the name for the key in dictionary and the other two in a list
        line = row.split(",")
        key = line[0]
        age = line[1]
        salary = line[2]

        if key in mydictionary:
            mydictionary[key][1] += salary
        else:
            mydictionary[key] = [age,salary]

    rownum += 1

ifile.close()

## create a new list of lists with the data from the dictionary
newcsvfile = ["name","age","salary"]

for i in mydictionary:
    newcsvfile.append(i,mydictionary[i][0],mydictionary[i][1])

## write the new list of lists in a new CSV file
with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(newcsvfile)

这不是一个 python 程序,所以严格来说它不能解决你的问题,从技术上讲,它甚至不是一个程序——只是一个命令行,但它确实说明了给猫剥皮的很多方法,其中一些相当优雅地。

字典是现代语言 python 的一个可爱的特性,但更早的语言,如 AWK,或者它的 linux 等效 GAWK,已经拥有它们短短 40 年,尽管当时它们被称为关联数组。

cat因此,这里有一个使用and的单行命令gawk,它能够接受代码作为参数来完成您的任务,这表明 linux 作为协作实用程序框架的设计原则仍然存在并且很好。

 $> cat in.dat | gawk '{if(NR==1)hdr=$0; else{emp[$1" "$2" "$3]=emp[$1" "$2" "$3]+$4}} END{print hdr; for(i in emp) print i,emp[i];}'  > out.dat

我已经从字面上理解了您的文件格式,如果您确实需要 true,CSVs那么一个小型 mod 将完成此操作。

cat in.csv | awk -F"," '{if(NR==1)hdr=$0; else{emp[$1","$2]=emp[$1","$2]+$3}} END{OFS=",";print hdr; for(i in emp) print i,emp[i];}' > out.csv

姓名、年龄、薪水

名称 2,55,20066

姓名 1,52,110322

名称 3,50,100054

CAWK由一些非常聪明的计算机科学家(包括著名的 Brian Kernighan)设计为一种文本操作语言,它通过自动解析输入到字段( $ 1、$ 2、...)中的任何输入并跟踪数字来实现这种紧凑性处理的行数。这允许跳过您可能需要在另一种语言中执行的大量 I/O 管理,因为它已经存在。