按多列对大型CSV文件进行排序/压缩

时间:2017-01-03 10:55:55

标签: python python-3.x sorting csv

因此我使用的csv文件如下所示:

Date Time,            SegmentID,   indicatorvalue
2016-12-01T00:00:00Z  147649       1
2016-12-01T00:01:00Z  147649       0
2016-12-01T00:02:00Z  147649       1
...                   ...          ...
2016-12-01T00:23:00Z  2938733      0

等。

我想要的是将其压缩到所有细分的列表中,然后将该细分受众群中有多少条目具有指标值的百分比按时间划分(AM / IP / PM / OP)

例如:

segmentID,  Time Period,  Percentage
147649      AM            78
147649      IP            100
147649      PM            60
147649      OP            30
243546      AM            79
243546      IP            98
...         ...           ...

我的尝试是设置一个for循环,这样对于每个段,它将保持一天4次的指标百分比的运行总计,然后一旦它检测到它已更改为新的segmentID它将附加这些值为字符串。

问题是segmentIDs是无序的,导致同一segmentID的多个条目。我试过通过SegmentID订购文件,但文件太大了。有关替代方法的任何建议吗?

编辑: 删除评论的人发布我应该使用Pandas,所以经过一些研究我的代码目前是:

import numpy as np
import pandas as pd

df=pd.read_csv("data.csv",sep=",",index_col="Segment ID",usecols=["Segment ID","Date Time","indicatorvalue"])
df['Date Time'] = ['AM' if '06' <= x[11:13] < '10' 
    else 'IP' if '10' <= x[11:13] < '16' 
    else 'PM' if '16' <= x[11:13] < '19'
    else 'OP' if '19' <= x[11:13] or x[11:13] < '06'
    else 'Error' for x in df['Date Time']]

现在,我只需要弄清楚如何使用重复条目压缩行,以便日期时间为&#39;和&#39; SegmentID&#39;,同时平均他们的&#39;指标值&#39;。

2 个答案:

答案 0 :(得分:0)

我假设输入文件的结构是每分钟一行,给出开始时间,段ID和指示符的值。

如果段的编号与可用内存兼容,我只会一次在线读取输入文件,并为每个段添加8个计数器,即每个时间和指标值。这意味着初始文件只读取一次,而不是排序,唯一的关键数量是段数 - 如果它变得太高,我会使用sqlite3或dbm数据库而不是dict。

使用您当前的示例(是csv),代码可以是:

BubbleSort(personen, anz); /* note, that the & had been removed. */

以上代码缺乏对错误或异常情况的测试

答案 1 :(得分:0)

我设法用熊猫制定解决方案。我使用的代码是:

import pandas as pd

df=pd.read_csv("data.csv",sep=",",usecols=["Segment ID","Date Time","indicator value"])

df['Date Time'] = ['AM' if '06' <= x[11:13] < '10' 
   else 'IP' if '10' <= x[11:13] < '16' 
   else 'PM' if '16' <= x[11:13] < '19'
   else 'OP' if '19' <= x[11:13] or x[11:13] < '06'
   else 'Error' for x in df['Date Time']]

grouped = df.groupby(['Segment ID','Date Time']).mean() 

grouped.to_csv('output.csv', sep =',')

我不能推荐Pandas。