【问题标题】:How to check missing values from particular column of python pandas dataframe?如何检查 python pandas 数据框特定列中的缺失值?
【发布时间】: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


    【解决方案1】:

    让我们将你的数据框称为df(因为我很懒,我只减少了消息列):

    # 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 中缺少什么。

    我还没有完全理解你想怎么做,但是如果要查看每个“qa”是否与“prod”匹配,你可以应用 set 函数,例如如果您想查看 prod 中的内容而不是 qa 中的内容:

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

    【讨论】:

    • @Wli- 您还没有收到问题。我不想找到 prod 中可用而 qa 中不可用的缺失数据,反之亦然。我想找到个人(qa 和 prod)的缺失数据。请参阅 Output.csv 以更好地理解它。
    • 嗯,我相信我的答案的第一部分仍然可以提供帮助。您需要处理我称为 qa 和 prod 的数据帧。您可能还需要按机器分组 (df.groupby('machine'))
    猜你喜欢
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2020-06-03
    • 2018-05-16
    • 1970-01-01
    • 2018-08-03
    • 2021-01-21
    相关资源
    最近更新 更多