У меня есть такой фреймворк python pandas с большим количеством столбцов и строк. Я хочу удалить все столбцы с NaN для каждой подкатегории, принадлежащей к той же категории. Как я могу удалить все столбцы NaN для каждой подкатегории?
Categ. Subcat. cond1 cond2 cond3 cond4 condk
0 A k NaN 6 4 9 8
1 A k NaN 7 3 NaN 2
2 A p 8 1 NaN NaN 3
3 A s 4 NaN 2 8 NaN
4 A t NaN 3 NaN 4 1
5 A t 2 9 NaN 5 4
После удаления cond1 для Subcat. k, выходной фрейм данных должен выглядеть следующим образом. У меня много столбцов, содержащих все NaN для подкатегории. Например, подкатегория. k имеет, скажем, 10 столбцов / cond1, cond5, cond9, con20 и т.д. / с NaN в качестве их значения для этого конкретного подкаталога.
Categ. Subcat. cond2 cond3 cond4...condk
A k 6 4 9 8
A k 7 3 NaN 2
A p 1 NaN NaN 3
A s NaN 2 8 NaN
A t 3 NaN 4 1
A t 9 NaN 5 4
то, что вы спрашиваете, похоже, в конечном итоге не будет столбцов вообще, если в каждом столбце есть хотя бы один NaN.
Не могли бы вы описать то, к чему стремитесь, т.е. почему вам нужно удалить NaN, а не заменять их? или вы пытаетесь просто агрегировать, какие условия присутствуют для каждого столбца, и в этом случае вы, вероятно, захотите получить один массив столбцов с допустимыми условиями
Цель состоит в том, чтобы уменьшить количество столбцов для каждого подкаталога. которые принадлежат к категории. У меня есть небольшое количество категорий, каждая из которых имеет n подкатегорий.
Это результат окончательный, который вам нужен, или просто результат после выполнения операции для подкатегории k
?
Вот пример DataFrame, чтобы его можно было скопировать:
Categ. Subcat. cond1 cond2 cond3 cond4 condk
0 A k NaN 6 4 9 8
1 A k NaN 7 3 NaN 2
2 A p 8 1 NaN NaN 3
3 A s 4 NaN 2 8 NaN
4 A t NaN 3 NaN 4 1
5 A t 2 9 NaN 5 4
df = df.rename(columns = {'Categ.':'C', 'Subcat.':'S'})
Группировать можно так: gb = df.groupby('S')
Потом:
for n, g in gb:
print(n, '\n', g.dropna(axis=1))
k
C S cond2 cond3 condk
0 A k 6.0 4.0 8.0
1 A k 7.0 3.0 2.0
p
C S cond1 cond2 condk
2 A p 8.0 1.0 3.0
s
C S cond1 cond3 cond4
3 A s 4.0 2.0 8.0
t
C S cond2 cond4 condk
4 A t 3.0 4.0 1.0
5 A t 9.0 5.0 4.0
Не совсем понятно, как вы хотите удалить строки / серии из DataFrame, но это должно дать вам начало ...
Спасибо, Алекс. Это работает. Мой следующий вопрос новичка: как сохранить вывод в отдельный DataFrame? Фрейм данных для k, p и t каждый.
Вам необходимо указать, чего вы ожидаете. Группы можно объединить, но вы получите NaN везде, где столбцы не совпадают.
for n, g in gb: s_df = g.dropna (axis = 1), how = 'all') # Удаляет все пустые столбцы для подпрограммы. break s_df # Это печатает DataFrame только для одной из подкатегорий. (k). Я хочу отображать для каждого и каждой подкатегории один за другим для k, t и s. Как я могу этого добиться?
Можете ли вы опубликовать пример желаемого результата? Я немного не понимаю, что именно вы хотите. И если у вас есть какой-либо код, который вы пробовали, публикация его (или его краткого отрывка) поможет людям увидеть, где вы ошиблись.