2017-08-09 141 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

相關問題