因此我使用的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;。
答案 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。