2017-08-09 161 views
0

我有一个数据帧下面 -如何检查python熊猫数据框特定列中的缺失值?

   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)在从消息列中遗漏之前。
  • 结束是(第一个可用编号-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 

如果您在理解此问题时有任何疑问,请随时填写。

回答

0

让我们把你的数据框df(我沦落到只能在消息栏,因为我lazzy):

# Stuff to get a similar dataframe#################### 
from io import StringIO 
import pandas as pd 
frame = """message 
qa : 6502444 
prod : 6502445 
qa : 6502445 
prod : 6502446 
qa : 6502446 
prod : 6502447""" 
df = pd.read_csv(io.StringIO(frame),header=0) 
# Stuff to get a similar dataframe END################ 
#split the message 
df2=df['message'].apply(lambda m : m.split(' : ')) 
#group by message type (qa or prod) 
df = pd.DataFrame(df2.tolist(),columns=['prodqa','message']) 
gb = df.groupby('prodqa') 
qa = gb.get_group('qa') 
prod = gb.get_group('prod') 

可以知道检查什么是质量保证和督促失踪。我没有完全理解你想怎么做,但如果要查看每个“qa”是否与“prod”相匹配,那么可以应用set函数,例如,如果你想看看什么是prod而不是qa:

missing_in_qa=prod['message'][~prod['message'].isin(qa['message'])] 
+0

@ Wli-您还没有得到它的问题。我不想找到在产品中可用的缺失数据,而在qa中不可用,反之亦然。我想查找个人(qa和prod)的缺失数据。请参阅Output.csv以更好地理解它。 – kit

+0

嗯,我相信我的答案的第一部分仍然有帮助。您需要处理我称为qa和prod的数据框。您可能还需要按机器进行分组(df.groupby('machine')) – Wli

相关问题