【问题标题】:Group data from a CSV file by field value按字段值对 CSV 文件中的数据进行分组
【发布时间】:2014-09-23 05:23:14
【问题描述】:

我有一个 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]

【问题讨论】:

  • 我是python新手,尝试逐行读取文件
  • 你在这方面取得了成功吗?你走了多远?我建议您查看csv 模块和字典。
  • 对于新手来说,如果数据真的那么简单,那么字符串拆分可能比使用 csv 模块更容易。

标签: python csv


【解决方案1】:

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

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

【讨论】:

  • 使用defaultdict 更容易。
  • 确实如此,但这对新手来说可能有点混乱。
  • 公平点,必须将函数传递给对象等等。
  • @Anto 现在我遇到了问题。现在我必须在函数中传递字典值。但我的函数将列表作为参数。你能帮忙吗
  • 我的函数名 percentile(N,.95),其中 N 是列表。我现在有 {'a': ['54.2', '77.2', '65.56'],'s': ['78.5'],'k': ['89.62']}。我如何将 ['54.2', '77.2', '65.56'] 作为名为“a”的列表传递
【解决方案2】:

这样做的一种方法是使用 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))

输出:

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

【讨论】:

    【解决方案3】:

    我尝试使用 groupby 和 apply 并最后通过 Series.to_json 将 Series 转换为 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]}
    

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2023-01-12
      • 2014-10-27
      • 2018-07-19
      相关资源
      最近更新 更多