代码之家  ›  专栏  ›  技术社区  ›  Mainland

为什么基于条件的过滤会导致panda中的DataFrame为空?

  •  1
  • Mainland  · 技术社区  · 1 年前

    我正在使用panda使用Python中的DataFrame,并试图根据多列的温度值应用多个条件来过滤行。然而,在应用我的条件并使用 dropna() ,尽管我希望一些数据满足这些条件,但我最终还是得到了零行。

    目标是与环境温度+40 C进行比较,如果该值大于此值,请将其替换为NaN。否则,请保持原始值。

    以下是我的DataFrame示例和我正在应用的条件:

    data = {
        'Datetime': ['2022-08-04 15:06:00', '2022-08-04 15:07:00', '2022-08-04 15:08:00', 
                     '2022-08-04 15:09:00', '2022-08-04 15:10:00'],
        'Temp1': [53.4, 54.3, 53.7, 54.3, 55.4],
        'Temp2': [57.8, 57.0, 87.0, 57.2, 57.5],
        'Temp3': [59.0, 58.8, 58.7, 59.1, 59.7],
        'Temp4': [46.7, 47.1, 80, 46.9, 47.3],
        'Temp5': [52.8, 53.1, 53.0, 53.1, 53.4],
        'Temp6': [50.1, 69, 50.3, 50.3, 50.6],
        'AmbientTemp': [29.0, 28.8, 28.6, 28.7, 28.9]
    }
    df1 = pd.DataFrame(data)
    df1['Datetime'] = pd.to_datetime(df1['Datetime'])
    df1.set_index('Datetime', inplace=True)
    

    密码

    temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6']
    ambient_col = 'AmbientTemp'
    
    condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))
    
    filtered_df = df1[condition].dropna()
    print(filtered_df.shape)
    

    回答

    (0, 99)
    

    问题

    尽管期望有效数据满足条件,但在应用筛选器并删除NaN值后,结果DataFrame为空。是什么原因导致了这个问题,我该如何纠正?

    2 回复  |  直到 1 年前
        1
  •  2
  •   jezrael    1 年前

    使用 DataFrame.where :

    condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))
    
    df1[temp_cols] = df1[temp_cols].where(condition)
    

    如果需要添加新的DataFrame DataFrame.reindex :

    temp_cols = ['Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5', 'Temp6']
    ambient_col = 'AmbientTemp'
    
    condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0))
    
    filtered_df = df1.where(condition.reindex(df1.columns, fill_value=True, axis=1))
    print(filtered_df)
                         Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
    Datetime                                                                  
    2022-08-04 15:06:00   53.4   57.8   59.0   46.7   52.8   50.1         29.0
    2022-08-04 15:07:00   54.3   57.0   58.8   47.1   53.1    NaN         28.8
    2022-08-04 15:08:00   53.7    NaN   58.7    NaN   53.0   50.3         28.6
    2022-08-04 15:09:00   54.3   57.2   59.1   46.9   53.1   50.3         28.7
    2022-08-04 15:10:00   55.4   57.5   59.7   47.3   53.4   50.6         28.9
    

    工作原理:

    #mask
    print(condition)
                         Temp1  Temp2  Temp3  Temp4  Temp5  Temp6
    Datetime                                                     
    2022-08-04 15:06:00   True   True   True   True   True   True
    2022-08-04 15:07:00   True   True   True   True   True  False
    2022-08-04 15:08:00   True  False   True  False   True   True
    2022-08-04 15:09:00   True   True   True   True   True   True
    2022-08-04 15:10:00   True   True   True   True   True   True
    
    #added Trues values in mask for missing columns - here `AmbientTemp`
    print (condition.reindex(df1.columns, fill_value=True, axis=1))
                         Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
    Datetime                                                                  
    2022-08-04 15:06:00   True   True   True   True   True   True         True
    2022-08-04 15:07:00   True   True   True   True   True  False         True
    2022-08-04 15:08:00   True  False   True  False   True   True         True
    2022-08-04 15:09:00   True   True   True   True   True   True         True
    2022-08-04 15:10:00   True   True   True   True   True   True         True
    
        2
  •  2
  •   mozway    1 年前

    您的条件是DataFrame,如果要按行进行选择,则应使用聚合 any / all :

    condition = (df1[temp_cols].lt(df1[ambient_col] + 40, axis=0)).all(axis=1)
    

    输出

                         Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
    Datetime                                                                  
    2022-08-04 15:06:00   53.4   57.8   59.0   46.7   52.8   50.1         29.0
    2022-08-04 15:09:00   54.3   57.2   59.1   46.9   53.1   50.3         28.7
    2022-08-04 15:10:00   55.4   57.5   59.7   47.3   53.4   50.6         28.9
    

    如果要遮罩值,请使用 where 重新编制索引后:

    df1.where(condition.reindex(columns=df1.columns, fill_value=True))
    

    输出

                         Temp1  Temp2  Temp3  Temp4  Temp5  Temp6  AmbientTemp
    Datetime                                                                  
    2022-08-04 15:06:00   53.4   57.8   59.0   46.7   52.8   50.1         29.0
    2022-08-04 15:07:00   54.3   57.0   58.8   47.1   53.1    NaN         28.8
    2022-08-04 15:08:00   53.7    NaN   58.7    NaN   53.0   50.3         28.6
    2022-08-04 15:09:00   54.3   57.2   59.1   46.9   53.1   50.3         28.7
    2022-08-04 15:10:00   55.4   57.5   59.7   47.3   53.4   50.6         28.9