Удаление столбцов NANS и объединение С исходным фреймом данных

#python #sql-server #pandas #pivot #nan

Вопрос:

У меня есть фрейм данных pandas с 1000 столбцами, который я получил из сводной таблицы sql. Из этого следует, что некоторые столбцы имеют подстроку ( например, содержит АЛЬФА ). Теперь фрейм данных выглядит следующим образом: ( здесь показан пример, скажем, для 5 АЛЬФА-столбцов).

Характеристика данных заключается в том, что для каждой однозначной комбинации Cols от A до ColE существует не более одного ненулевого значения для каждого альфа-столбца

       input_df 
      
        ColA   ColB   ColC   ColD  ColE    ALPHA_1   ALPHA_2  ALPHA_3  ALPHA_4   ALPHA_5.......
        
          x      y      z     p     q       NAN       1        NAN      NAN       2
          
          x      y      z     p     q        2        NAN      NAN       NAN      NAN

          x      y      z     p     q        NAN      NAN      11       NAN       NAN
          
          x      y      z     p     q        NAN      NAN      NAN       15        NAN
          
          u      v      w     z     k        11      NAN       NAN      NAN        1
          
          u      v      w     z     k       NAN      NAN       34       NAN        NAN
          
          u      v      w     z     k        NAN      6       NAN      NAN        NAN
          
          u      v      w     z     k       NAN      NAN       NAN       76        NAN
          
          b      d      y     s     t        NAN       4        NAN      NAN      NAN
          
          b      d      y     s     t        NAN       NAN      8         NAN      80
          
          b      d      y     s     t        NAN       NAN      NAN       9        NAN
          
          b      d      y     s     t        88        NAN      NAN        NAN    NAN
          
                      
                  
 

То, что я ищу,-это удалить все NAN из столбцов и объединить и объединить их, когда Cols A-E одинаковы.
Таким образом, данные должны выглядеть следующим образом

         output_df  
        
        
         ColA   ColB   ColC   ColD  ColE    ALPHA_1  ALPHA_2  ALPHA_3  ALPHA_4    ALPHA_5 .......
        
        
          x      y      z     p     q       2       1        11        15         2
          
          u      v      w     z     k        11      6       34        76        1
          
          u      v      w     z     k       NAN      NAN       34       NAN        NAN
          
          u      v      w     z     k        NAN      6       NAN      NAN        NAN
          
          u      v      w     z     k       NAN      NAN       NAN       76        3
          
          b      d      y     s     t        88       4        8          9        8
          
          
          
 

То, что я планировал, — это создать подмножество Cols от ColA до Col E и один
путем создания подмножества cols, содержащего только альфа, а затем удалите дубликаты из первого кадра данных(keydf)
, а затем удалите NAN из каждого столбца из второго кадра данных (newdf), а затем соедините два кадра данных по индексу.

           keydf = input_df.loc[:, input_df.columns.str.contains('COL')]
          
          newdf = input_df.loc[:, input_df.columns.str.contains('ALPHA')]
    
    
 

Однако я застрял на этом этапе и не знаю, как действовать дальше. Любая помощь будет безмерно признательна.

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

1. Если вы уверены, что для каждой уникальной комбинации ColX столбцов существует не более 1 значения для каждого из ALPHA_X столбцов, то, я думаю, вы можете просто сгруппировать ColX столбцы и подать pd.Dataframe.sum заявку с axis = 0

2. некоторые детали, пожалуйста, если вы не возражаете ( предполагая, что только ColA amp; Col B), скажите. Я думаю, что это так, но я могу подтвердить. Спасибо

3. input_df.groupby(["ColA", "ColB", "ColC", "ColD", "ColE"]).apply(pd.DataFrame.sum, axis=0).reset_index() попробуйте, я не проверял это, потому что мне нужно было бы восстановить ваш фрейм данных с нуля. Если это не сработает (может зависеть от версии pandas, попробуйте input_df.groupby(["ColA", "ColB", "ColC", "ColD", "ColE"]).apply(lambda df: df[["ALPHA_1", "ALPHA_2", "ALPHA_3", "ALPHA_4", "ALPHA_5"]].sum(axis=0)).reset_index()

4. спасибо, позвольте мне попробовать и буду держать вас в курсе

5. Ну, первый не сработал, для второго это не очень хорошее решение, так как тогда мне придется вручную указывать все 100 альфа-столбцов