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

Bis*_*ain 7 python csv

我有一个 csv 文件,它在第一列中有重复的值。我想为第一列的一个值收集列表中第二列的所有值

column1 column2
a        54.2
s        78.5
k        89.62
a        77.2
a        65.56
Run Code Online (Sandbox Code Playgroud)

我想变得像

print a  # [54.2,77.2,65.56]
print s  # [78.5]
print k  # [89.62]
Run Code Online (Sandbox Code Playgroud)

Ant*_*nto 8

使用 python 的CSV reader似乎相当简单。

数据.csv

a,54.2
s,78.5
k,89.62
a,77.2
a,65.56
Run Code Online (Sandbox Code Playgroud)

脚本文件

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
Run Code Online (Sandbox Code Playgroud)

输出

{
    'a': ['54.2', '77.2', '65.56'], 
    's': ['78.5'], 
    'k': ['89.62']
}
Run Code Online (Sandbox Code Playgroud)

正如@Pete 指出的那样,您可以使用defaultdict美化它:

脚本文件

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
Run Code Online (Sandbox Code Playgroud)


小智 5

一种方法是使用 Pandas,填充数据框,使用 groupby,然后将列表应用于所有组:

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))
Run Code Online (Sandbox Code Playgroud)

输出:

column1
a    [54.2, 77.2, 65.56]
k                [89.62]
s                 [78.5]
Name: column2, dtype: object
Run Code Online (Sandbox Code Playgroud)