Как обнаружить пропущенные значения, если фрейм данных уже удалил пропущенные строки? - PullRequest
0 голосов
/ 13 мая 2019

У меня есть фрейм данных, который содержит данные временного ряда по 30 последовательных дней, каждый день должен содержать данные по 24 часа от 0 до 23, поэтому в фрейме данных должно быть 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   |    

затем external соедините его с исходным, но это не сработало.

1 Ответ

0 голосов
/ 13 мая 2019

Создайте вспомогательный DataFrame с помощью product и 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

Или создайте MultiIndex с помощью MultiIndex.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
...