按字段值对CSV文件中的数据进行分组

11 投票
3 回答
20867 浏览
提问于 2025-04-18 15:28

我有一个CSV文件,里面第一列有重复的值。我想把第二列中与某个第一列的值对应的所有值收集到一个列表里。

column1 column2
a        54.2
s        78.5
k        89.62
a        77.2
a        65.56

我想得到的结果是这样的

print a  # [54.2,77.2,65.56]
print s  # [78.5]
print k  # [89.62]

3 个回答

0

我尝试过类似的方法,就是用 groupby 和 apply,然后用 Series.to_json 把结果转换成 json 格式。

输入数据

df = pd.DataFrame({'column1':['a','s','k','a','a'],'column2':[54.2,78.5,89.62,77.2,65.56]})

输入数据内容

column1  column2
0       a    54.20
1       s    78.50
2       k    89.62
3       a    77.20
4       a    65.56

解决方案:

jsonData = df.groupby('column1')['column2'].apply(list)
print(jsonData.to_json())
# if you want write a file into json
jsonData.to_json(r"D:/abc/def/xyz.json")

期望的输出结果

{"a":[54.2,77.2,65.56],"k":[89.62],"s":[78.5]}
9

实现这个功能的一种方法是使用pandas库。首先,你需要创建一个数据框(dataframe),然后使用groupby功能对数据进行分组,最后对所有的组应用list操作。

import pandas as pd

df = pd.DataFrame({'column1':['a','s','k','a','a'],'column2': 
[54.2,78.5,89.62,77.2,65.56]})
print(df.groupby('column1')['column2'].apply(list))

输出结果:

column1
a    [54.2, 77.2, 65.56]
k                [89.62]
s                 [78.5]
Name: column2, dtype: object
10

使用Python的CSV读取器看起来非常简单。

data.csv

a,54.2
s,78.5
k,89.62
a,77.2
a,65.56

script.py

import csv

result = {}

with open('data.csv', 'rb') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in csvreader:
        if row[0] in result:
            result[row[0]].append(row[1])
        else:
            result[row[0]] = [row[1]]

print result

输出结果

{
    'a': ['54.2', '77.2', '65.56'], 
    's': ['78.5'], 
    'k': ['89.62']
}

正如@Pete提到的,你可以用defaultdict来美化代码:

script.py

import csv
from collections import defaultdict

result = defaultdict(list)  # each entry of the dict is, by default, an empty list

with open('data.csv', 'rb') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=',', quotechar='"')
    for row in csvreader:
        result[row[0]].append(row[1])

print result

撰写回答