Как удалить все столбцы NaN для каждой подкатегории?

У меня есть такой фреймворк 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

Можете ли вы опубликовать пример желаемого результата? Я немного не понимаю, что именно вы хотите. И если у вас есть какой-либо код, который вы пробовали, публикация его (или его краткого отрывка) поможет людям увидеть, где вы ошиблись.

ASGM 27.10.2018 04:31

то, что вы спрашиваете, похоже, в конечном итоге не будет столбцов вообще, если в каждом столбце есть хотя бы один NaN.

MrE 27.10.2018 05:25

Не могли бы вы описать то, к чему стремитесь, т.е. почему вам нужно удалить NaN, а не заменять их? или вы пытаетесь просто агрегировать, какие условия присутствуют для каждого столбца, и в этом случае вы, вероятно, захотите получить один массив столбцов с допустимыми условиями

MrE 27.10.2018 05:27

Цель состоит в том, чтобы уменьшить количество столбцов для каждого подкаталога. которые принадлежат к категории. У меня есть небольшое количество категорий, каждая из которых имеет n подкатегорий.

user10565646 27.10.2018 14:49

Это результат окончательный, который вам нужен, или просто результат после выполнения операции для подкатегории k?

ASGM 27.10.2018 18:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
132
1

Ответы 1

Вот пример 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 каждый.

user10565646 28.10.2018 02:08

Вам необходимо указать, чего вы ожидаете. Группы можно объединить, но вы получите NaN везде, где столбцы не совпадают.

Alex 28.10.2018 12:56

for n, g in gb: s_df = g.dropna (axis = 1), how = 'all') # Удаляет все пустые столбцы для подпрограммы. break s_df # Это печатает DataFrame только для одной из подкатегорий. (k). Я хочу отображать для каждого и каждой подкатегории один за другим для k, t и s. Как я могу этого добиться?

user10565646 28.10.2018 18:55

Другие вопросы по теме