#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)