#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 альфа-столбцов