как мне преобразовать этот фрейм данных и применить фильтр к ячейкам?

#pandas #dataframe #lambda #transpose

#pandas #фрейм данных #лямбда #транспонировать

Вопрос:

Третий случай за два дня!

У меня есть следующий фрагмент фрейма данных (где столбцы изначально были многоиндексированы, но после сохранения df в CSV и чтения его обратно я потерял индексацию, и второй уровень на самом деле является строкой):

отредактировано:

 model     model_a       model_a         model_b         model_b
NaN       b             pvalue          b               pvalue
predictor NaN           NaN             NaN             NaN 
aches     0.6991801946  0.33372434223   0.3523114106    0.0359096002
cough     0.7164202952  0.00796337569   0.7405228672    0.0473180859
 

Мой вариант использования — теперь перенести предикторы ache и cough столбцы as и верхний уровень индексированных столбцов в виде строк, так что, если значение pvalue <= 0.05, ячейка должна быть нулевой, в противном случае значение b должно быть в этой ячейке. Я предполагаю, что оценка pvalue будет в лямбда-функции, но я могу ошибаться!

Таким образом, желаемый фрейм данных будет:

 model      aches           cough            
model_a    NaN          0.7164202952
model_b    0.3523114106 0.7405228672    
 

Честно говоря, я понятия не имею, как это сделать, не говоря уже о том, с чего начать. Любая помощь будет очень признательна.

Ответ №1:

Попробуйте с pd.IndexSlice помощью where

 out = df.loc[:,pd.IndexSlice[:,'b']].where(df.loc[:,pd.IndexSlice[:,'pvalue']].values<0.05).T.reset_index(level=1,drop=True)
       aches     cough
ma       NaN  0.716420
mb  0.352311  0.740523
 

Комментарии:

1. Я получаю сообщение об ошибке TypeError: unhashable type: 'slice' … возможная проблема с пустыми ячейками во второй и третьей строках? См. Редактирование выше.

2. Возможно ли, что, поскольку форма моего фрейма данных такова, что Out[216]: (26, 27) это будет проблемой (мой фрагмент был 5×5)?

3. Похоже, что когда я сохранил это в CSV и прочитал его снова, я потерял mullti-index. Я соответствующим образом обновляю вопрос mu на основе этого.

4. Сделал это, и теперь просто сражаюсь с str, который должен быть с плавающей точкой: test = df.T.set_index(0, append=1).T

5. это работает, за исключением того, что имена предикторов не транспонируются соответствующим образом.