Nan в pd.DataFrame (симметричная матрица)

#python #pandas

#python #панды

Вопрос:

У меня есть фрейм данных, подобный этому. Я бы хотел удалить nan и сдвинуть ячейки вверх. Затем добавьте столбец даты и установите его в качестве индекса.

                 ciao      google    microsoft
Search Volume   368000    NaN       NaN
Search Volume   368000    NaN       NaN
Search Volume   450000    NaN       NaN
Search Volume   450000    NaN       NaN
Search Volume   450000    NaN       NaN
Search Volume   450000    NaN       NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       37200000  NaN
Search Volume   NaN       NaN       135000
Search Volume   NaN       NaN       135000
Search Volume   NaN       NaN       110000
Search Volume   NaN       NaN       110000
Search Volume   NaN       NaN       110000
Search Volume   NaN       NaN       110000
  

Вывод должен быть следующим:

 date = ['20140115', '20140215', '20140315', '20140415', '20140515', '20140615']

date        ciao    google      microsoft
20140115    368000  37200000    135000
20140215    368000  37200000    135000
20140315    450000  37200000    110000
20140415    450000  37200000    110000
20140515    450000  37200000    110000
20140615    450000  37200000    110000
  

Выглядит просто, но я не знаю, как это сделать. Спасибо

Ответ №1:

вы могли бы использовать apply с dropna:

 df = df.apply(lambda x: pd.Series(x.dropna().values)).fillna('')
df['date'] = date
print(df)
  

вывод:

      ciao      google   microsoft  date     
 368000.0  37200000.0   135000.0   20140115 
 368000.0  37200000.0   135000.0   20140215 
 450000.0  37200000.0   110000.0   20140315 
 450000.0  37200000.0   110000.0   20140415 
 450000.0  37200000.0   110000.0   20140515 
 450000.0  37200000.0   110000.0   20140615 
  

Ответ №2:

Вы также можете использовать dropna для столбцов в виде рядов

 df1=pd.DataFrame(data=[df[i].dropna().values for i in df.columns]).T
df1.index=dates
  

Ответ №3:

Одно сложное решение, вызванное тем, что у вас дублированный индекс

 pd.concat([df[x].dropna() for x in df.columns],1)
Out[24]: 
                  ciao      google  microsoft
SearchVolume  368000.0  37200000.0   135000.0
SearchVolume  368000.0  37200000.0   135000.0
SearchVolume  450000.0  37200000.0   110000.0
SearchVolume  450000.0  37200000.0   110000.0
SearchVolume  450000.0  37200000.0   110000.0
SearchVolume  450000.0  37200000.0   110000.0
  

Ответ №4:

Мое предложение таково:

 pd.DataFrame(data={ colName: df[colName].dropna().values for colName in df.columns },
    index=['20140115', '20140215', '20140315', '20140415', '20140515', '20140615'])
  

Главное — это понимание по словарю, выполняемое для каждого столбца.

dropna удаляет элементы NaN, а значения позволяют освободиться от значений индекса.

Ответ №5:

Это должно сработать:

 denulled = {col: df.loc[df[col].notnull(),col].values for col in df.columns}

df_out = pd.DataFrame(denulled, index=date)