【问题标题】:How to detect missing values if the dataframe has removed the missing rows already?如果数据框已经删除了缺失的行,如何检测缺失值?
【发布时间】:2019-05-13 09:11:18
【问题描述】:

我有一个包含连续 30 天的时间序列数据的数据框,每天应该包含从 0 到 23 的 24 小时数据,因此假设数据框中有 24*30 = 720 行。但是,已经从数据框中删除了一些包含“Fooo”列缺失记录的行。

Index      | DATE(YYYY/MM/DD) |  Hour   |    Fooo
  0        | 2015/01/01       |    0    |     x 
  1        | 2015/01/01       |    1    |     xy 
  2        |     ...          |    ...  |     z 
  23       | 2015/01/01       |    23   |     z 

  24       | 2015/01/02       |    0    |     z 
  25       | 2015/01/02       |    2    |     bz 
  ...      |     ...          |    ...  |     z 
  46       | 2015/01/02       |    23   |     zz 
...
...
  680      | 2015/01/30       |    1    |     z 
  681      | 2015/01/30       |    3    |     bz 
  ...      |     ...          |    ...  |     z 
  701      | 2015/01/30       |    23   |     zz

我想重写数据框,使其包含完整的 720 行,“Fooo”列中的缺失值用“NA”填充。

Index      | DATE(YYYY/MM/DD) |  Hour   |    Fooo
  0        | 2015/01/01       |    0    |     x 
  1        | 2015/01/01       |    1    |     xy 
  2        |     ...          |    ...  |     z 
  23       | 2015/01/01       |    23   |     z 

  24       | 2015/01/02       |    0    |     z 
  25       | 2015/01/02       |    1    |     NA   
  26       | 2015/01/02       |    2    |     bz 
  ...      |     ...          |    ...  |     z 
  47       | 2015/01/02       |    23   |     zz 
...
...
  690      | 2015/01/30       |    0    |     NA
  691      | 2015/01/30       |    1    |     z 
  692      | 2015/01/30       |    2    |     NA
  693      | 2015/01/30       |    3    |     bz 
  ...      |     ...          |    ...  |     z 
  719      | 2015/01/30       |    23   |     zz

如何在熊猫中做到这一点?我试图用一列“Hour”创建另一个数据框,如下所示:

Index      |  Hour   |    
  0        |    0    |    
  1        |    1    |    
  2        |    ...  |     
  23       |    23   |    

  24       |    0    |    
  25       |    1    |       
  26       |    2    |    
  ...      |     ...        
  47       |    23   |   
...
...
  690      |    0    |     
  691      |    1    |      
  692      |    2      
  693      |    3    |     
  ...      |         |    
  719      |    23   |    

然后将它与原来的外部连接起来,但它不起作用。

【问题讨论】:

    标签: pandas missing-data


    【解决方案1】:

    通过productDataFrame.merge 使用左连接创建助手DataFrame:

    from  itertools import product
    
    df['DATE(YYYY/MM/DD)'] = pd.to_datetime(df['DATE(YYYY/MM/DD)'])
    
    df1 = pd.DataFrame(list(product(df['DATE(YYYY/MM/DD)'].unique(), range(27))), 
                       columns=['DATE(YYYY/MM/DD)','Hour'])
    df = df1.merge(df, how='left')
    print (df.head(10))
      DATE(YYYY/MM/DD)  Hour Fooo
    0       2015-01-01     0    x
    1       2015-01-01     1   xy
    2       2015-01-01     2  NaN
    3       2015-01-01     3  NaN
    4       2015-01-01     4  NaN
    5       2015-01-01     5  NaN
    6       2015-01-01     6  NaN
    7       2015-01-01     7  NaN
    8       2015-01-01     8  NaN
    9       2015-01-01     9  NaN
    

    或通过MultiIndex.from_product 创建MultiIndex 并使用DataFrame.reindex 追加缺失的行:

    df['DATE(YYYY/MM/DD)'] = pd.to_datetime(df['DATE(YYYY/MM/DD)'])
    
    mux = pd.MultiIndex.from_product([df['DATE(YYYY/MM/DD)'].unique(), range(27)], 
                                         names=['DATE(YYYY/MM/DD)','Hour'])
    df = df.set_index(['DATE(YYYY/MM/DD)','Hour']).reindex(mux).reset_index()
    print (df.head(10))
      DATE(YYYY/MM/DD)  Hour Fooo
    0       2015-01-01     0    x
    1       2015-01-01     1   xy
    2       2015-01-01     2  NaN
    3       2015-01-01     3  NaN
    4       2015-01-01     4  NaN
    5       2015-01-01     5  NaN
    6       2015-01-01     6  NaN
    7       2015-01-01     7  NaN
    8       2015-01-01     8  NaN
    9       2015-01-01     9  NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2022-01-20
      相关资源
      最近更新 更多