当前位置: 首页 > 知识库问答 >
问题:

Python—读取csv并按列分组数据

花飞扬
2023-03-14

我正在处理一个包含3列的csv文件,如下所示:

timeStamp, value, label
15:22:57, 849, CPU pid=26298:percent
15:22:57, 461000, JMX MB
15:22:58, 28683, Disks I/O
15:22:58, 3369078, Memory pid=26298:unit=mb:resident
15:22:58, 0, JMX 31690:gc-time
15:22:58, 0, CPU pid=26298:percent
15:22:58, 503000, JMX MB

标签列包含不同的值(比如总共5个),其中包括空格、冒号和其他特殊字符。

我试图实现的是根据每个指标绘制时间图(在同一个图上或在不同的图上)。我可以使用matplotlib,但首先需要根据“标签”对[时间戳,值]对进行分组。

我查看了csv.DictReader以获得标签,并将itertools.groupby以“标签”进行分组,但我正在努力以一种正确的“pythonic”方式完成这项工作。

有什么建议吗?

共有3个答案

萧心水
2023-03-14

您可以使用numpy.loadtxt

import numpy as np
result = np.loadtxt('MYFILE', usecols=(0, 1, 2), 
          dtype=[('time', 'S8'), ('values', np.uint), ('label', 'S33')], 
          delimiter=', ')

这将把表加载到一个结构化数组中,其中时间保存为8个字符的字符串(“S8”),值保存为无符号整数,标签保存为最多33个字符的字符串(“S33”,您可能需要调整此大小)。然后,可以按类型为值编制索引:

>>> print result['values']
[    849  461000   28683 3369078       0       0  503000]

并根据标签过滤,如果你想要:

>>> print result['values'][result['label'] == 'JMX MB']
[461000 503000]

要将时间从字符串转换为浮点数,可以使用pylab的datedatestr2num并将其作为转换器提供给loadtxt

import pylab
result = np.loadtxt('MYFILE', usecols=(0, 1, 2), 
           dtype=[('time', np.float), ('values', np.uint), ('label', 'S33')],
           delimiter=', ', converters={0: pylab.datestr2num})
洪鹏海
2023-03-14

您可以尝试pandas,它为处理数据提供了一个很好的结构。

读取csv到DataFrame

In [123]: import pandas as pd

In [124]: df = pd.read_csv('test.csv', skipinitialspace=True)

In [125]: df
Out[125]: 
  timeStamp    value                              label
0  15:22:57      849              CPU pid=26298:percent
1  15:22:57   461000                             JMX MB
2  15:22:58    28683                          Disks I/O 
3  15:22:58  3369078  Memory pid=26298:unit=mb:resident
4  15:22:58        0                  JMX 31690:gc-time
5  15:22:58        0              CPU pid=26298:percent
6  15:22:58   503000                             JMX MB

按标签对数据帧进行分组

In [154]: g =  df.groupby('label')

现在你可以得到你想要的了

In [155]: g.get_group('JMX MB')
Out[155]:
  timeStamp   value   label
1  15:22:57  461000  JMX MB
6  15:22:58  503000  JMX MB
温嘉玉
2023-03-14

您不需要Groupby;您希望使用collections.defaultdict收集一系列由标签键控的[时间戳,值]对:

from collections import defaultdict
import csv

per_label = defaultdict(list)

with open(inputfilename, 'rb') as inputfile:
    reader = csv.reader(inputfile)
    next(reader, None)  # skip the header row

    for timestamp, value, label in reader:
        per_label[label.strip()].append([timestamp.strip(), float(value)])

现在,per_label是一个字典,标签作为键,而[时间戳,值]对作为值;我已经去掉了空白(您的输入示例有很多额外的空白),并将列变成了浮点数。

对于您的(有限的)输入示例,结果是:

{'CPU pid=26298:percent': [['15:22:57', 849.0], ['15:22:58', 0.0]],
 'Disks I/O': [['15:22:58', 28683.0]],
 'JMX 31690:gc-time': [['15:22:58', 0.0]],
 'JMX MB': [['15:22:57', 461000.0], ['15:22:58', 503000.0]],
 'Memory pid=26298:unit=mb:resident': [['15:22:58', 3369078.0]]}
 类似资料:
  • 我遇到了一个挑战,我必须读取CSV文件并将其读取,直到定义的可变大小限制(BATCH_SIZE)。读取 CSV 中的行数后,将其发送到不同的 AWS API。由于我的CSV文件大小可以是1Gb到2Gb的任何地方,因此我避免使用JSR223 CSV文件读取。我想知道如何使用JMeter和CSV数据集配置来实现它。

  • 从csv中读取内容的最佳方式是什么,但只能读取一个特定列,如? 然后,该列应存储在如下数组中: 到目前为止,我对熊猫的看法是: 我已经研究过这条线了。我仍然得到一个。 编辑: 这不是一张表,它是逗号分隔的,如下所示:

  • 我有一个熊猫数据框,格式如下: df: 现在我想将其分为两列,如下所示: 输出: 我想得到每一行的计数,如下所示。预期产出: 如何获得我的预期输出?我想找出每个“col2”值的最大计数?

  • 我有以下格式的文件

  • 我有一个csv文件,如下所示: ... 我怎样才能在python中只读取列“AAA、DDD、FFF、GGG”并跳过标题?我想要的输出是一个元组列表,如下所示:[(1,4,3,20),(2,5,2,23),(4,6,1,22)]。我正在考虑稍后将这些数据写入SQLdatabase。 我参考了这篇文章:用csv模块从csv文件中读取特定的列?。但是我不认为这对我有什么帮助。因为我的. csv很大,有一

  • 问题内容: 我有一个csv文件,看起来像这样: … 如何只读取python中的“ AAA,DDD,FFF,GGG”列并跳过标题?我想要的输出是一个看起来像这样的元组列表:[(1,4,3,20),(2,5,2,23),(4,6,1,22)]。我正在考虑稍后将这些数据写入SQLdatabase。 我提到了这篇文章:使用csv模块从csv文件中读取特定的列?。但是我认为这对我的情况没有帮助。由于我的.c