csv 如何通过不同元素匹配数据集的多个元素?(例如,年份和公司)

1sbrub3j  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(111)

我正在处理一个由CSV文件组成的数据集,我的任务是总结所有特定的数据点,以便它们可以被视为一个而不是多个。例如,每条记录由(year,name,ID,value)组成,其中ID、姓名和年份可以重复。我的最终目标是一个程序,有效地看每一年,然后在这一年的每个名字,最后为任何相同的ID的总和的价值。我正在使用内置在Python中的CSV阅读器,但也可以使用Pandas,因为所有的CSV都将在项目结束时使用它转换为.dta文件。我知道一个for循环 * 将 * 工作在这里,我只是检查每一行重复的年份,名称和ID,但我工作的记录超过一百万,所以优化将大大帮助。

pnwntuvh

pnwntuvh1#

import pandas as pd

# import csv file
#df = pd.read_csv('test.csv')

# Toy dataset
df = pd.DataFrame({
    'year': [2020, 2020, 2021, 2021, 2022, 2022, 2022],
    'name': ['Alice', 'Bob', 'Alice', 'Bob', 'Alice', 'Charlie', 'Charlie'],
    'ID': ['A001', 'B002', 'A001', 'B002', 'A001', 'C003', 'C003'],
    'value': [10, 15, 20, 25, 30, 35, 40]
})

# Group by 'year' and 'name' columns and calculate the sum of 'value'
df['total'] = df.groupby(['year', 'name', 'ID'])['value'].transform('sum')

# Print the DataFrame
print(df)
gj3fmq9x

gj3fmq9x2#

如果你需要速度,polars有一个用Rust编写的核心,并且在基准游戏中表现得非常好。我个人认为它的API非常直观。这里有一个解决这个问题的极端解决方案,但一如既往,要根据您的数据对不同的解决方案进行基准测试。

data.csv

year,name,id,value
2006,bob,1,3
2006,bob,1,4
2007,sally,1,4

main.py

import polars as pl

q = (
    pl.scan_csv("data.csv")
    .groupby("year", "name", "id")
    .agg((pl.col("value").sum().alias("value_sum"),))
)

q.collect().write_csv("output.csv")

output.csv

year,name,id,value_sum
2007,sally,1,4
2006,bob,1,7
kse8i1jr

kse8i1jr3#

你可以用O(n)的时间复杂度来完成这个任务。使用字典,这个解决方案变得微不足道。遍历csv中的每一行并提取字段。从那里,使用重复字段作为键关联值。一个简单的例子:

mappings = {}
for line in csv:
    tokens = line.split(",")
    id = tokens[0]
    year = tokens[1]
    value = eval(tokens[2])
    if id in mappings:
         mappings[f"{id}-{year}"] += value
    else:
         mappings[f"{id}-{year}"] = value
print(mappings)

你必须根据你的特定用例进行修改,但是在字典中添加键的时间复杂度为O(1),所以这可能是最简单的“快速”解决方案。如果在实现了这个策略之后,你发现你需要更快的速度,我建议你考虑一下C++和线程。

相关问题