【发布时间】:2018-01-16 22:59:53
【问题描述】:
我有一个 数据框,如下所示 -
time machine message
6 2017-08-07 05:24:31,955 solid qa : 6502444
20 2017-08-07 05:24:32,024 solid prod : 6502445
32 2017-08-07 05:24:32,033 solid qa : 6502445
44 2017-08-07 05:24:32,041 solid prod : 6502446
56 2017-08-07 05:24:32,055 solid qa : 6502446
68 2017-08-07 05:24:32,063 solid prod : 6502447
80 2017-08-07 05:24:32,071 solid qa : 6502450
92 2017-08-07 05:24:32,079 solid prod : 6502451
92 2017-08-07 05:24:32,079 solid qa : 6502452
104 2017-08-07 05:24:32,086 solid prod : 6502453
116 2017-08-07 05:24:32,094 liquid qa : 700001
128 2017-08-07 05:24:32,101 liquid prod : 700004
140 2017-08-07 05:24:32,108 liquid qa : 700002
152 2017-08-07 05:24:32,115 liquid prod : 700005
164 2017-08-07 05:24:32,126 liquid qa : 700007
176 2017-08-07 05:24:32,133 liquid prod : 700010
188 2017-08-07 05:24:32,140 liquid qa : 700008
200 2017-08-07 05:24:32,147 liquid prod : 700011
我想知道关于 qa 和 prod 的消息列中缺少哪些数字。
示例 -
机器列 - 实心,在消息列 qa : 6502446 中。在这一行之后,我期待机器列 - 实心,在消息列 qa : 6502447 但它不可用意味着丢失,例如 6502448 也丢失了。 prod 也一样。
我想生成一个 csv 格式的输出文件,其标题如下 -
machine,message_header,missing_number_size,start,end,start_time,end_time
详细信息 -
- 机器是固体或液体(在这种情况下,即如果第三个可用,则需要考虑)。
- message_header 在消息列值中可用。它是固定的 qa 或 prod。
- missing_number_size 也是 qa 和 prod 之间遗漏的数字。
- 开始是(最后一个可用的数字 + 1),在未从消息列中删除之前。
- end 是(第一个可用数字 - 1)在从消息列中错过之后。
- start_time 是从时间列中错过之前的最后可用时间。
- end_time 是错过时间列后的第一个可用时间。
Output.csv 将如下所示 -
machine,message_info,missin_number_size,start,end,start_time,end_time
solid,qa,3,6502447,6502449,2017-08-07 05:24:32,055,2017-08-07 05:24:32,071
solid,qa,1,6502451,6502451,2017-08-07 05:24:32,071,2017-08-07 05:24:32,079
solid,prod,3,6502448,6502450,2017-08-07 05:24:32,063,2017-08-07 05:24:32,079
solid,prod,1,6502452,6502452,2017-08-07 05:24:32,079,2017-08-07 05:24:32,086
liquid,qa,4,700003,700006,2017-08-07 05:24:32,108,2017-08-07 05:24:32,126
liquid,prod,4,700006,700009,2017-08-07 05:24:32,115,2017-08-07 05:24:32,133
编辑 1- 根据评论回答我做了什么?
我做了下面的实验,但它不是熊猫方式。在控制台上打印输出结果需要时间。我想要熊猫的方式(快)-
代码中的假设 - 数据是字典,其中包含像上面一样的整个数据框的值。
for key, value in data.iteritems():
prev_qa_no = 0
prev_prod_no = 0
prev_time = ""
total_count = 0
flag = False
qa = value[value['message'].str.contains("qa")]
prod = value[value['message'].str.contains("prod")]
qa['qa'] = qa['message'].apply(remove_name)
del qa['message']
qa.sort_values('qa',inplace=True)
for index, row in qa.iterrows():
time = row['time']
feed = row['feed']
qa_no = int(row['qa'])
if flag:
if (qa_no - prev_qa_no) > 1:
diff=qa_no-prev_qa_no+1
print str(feed.strip())+",qa,"+str(diff)+","+str(prev_qa_no+1)+","+str(qa_no-1)+","+str(prev_time.strip())+","+str(time)
flag = True
prev_time = time
prev_qa_no = qa_no
prev_time = ""
total_count = 0
prod['prod'] = prod['message'].apply(remove_name)
del prod['message']
prod.sort_values('prod',inplace=True)
flag = False
for index, row in prod.iterrows():
time = row['time']
feed = row['feed']
prod_no = int(row['prod'])
if flag:
if (prod_no - prev_prod_no) > 1:
diff=prod_no-prev_prod_no+1
print str(feed.strip())+",prod,"+str(diff)+","+str(prev_prod_no+1)+","+str(prod_no-1)+","+str(prev_time.strip())+","+str(time)
flag = True
prev_time = time
prev_prod_no = prod_no
如果您在理解这个问题时有任何疑问,请随意填写。
【问题讨论】:
标签: python python-2.7 pandas csv missing-data