如果数据框已删除缺失行,如何检测缺失值?

时间:2019-05-13 09:11:19

标签: pandas missing-data

我有一个数据帧,其中包含连续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

如何在熊猫中做到这一点?我试图用这样的一列“小时”创建另一个数据框:

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   |    

然后将外部与原始的外部连接起来,但是没有用。

1 个答案:

答案 0 :(得分:0)

通过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