首页 > 解决方案 > 如果数据框已经删除了缺失的行,如何检测缺失值?

问题描述

我有一个包含连续 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   |    

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

标签: pandasmissing-data

解决方案


通过左连接product创建助手 DataFrame :DataFrame.merge

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

或创建MultiIndexMultiIndex.from_product用于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

推荐阅读