Найти ячейки с данными и использовать в качестве индекса в dataframe

#python #pandas

#python #pandas

Вопрос:

Я читаю файл Excel, но для целей этого вопроса я приведу пример того, как выглядит мой dataframe. У меня есть dataframe вот так:

 df = pd.DataFrame([
        ['Texas 1', '111', '222', '333'],
        ['Texas 1', '444', '555', '666'],
        ['Texas 2', '777','888','999']
    ])
df[2] = df[2].replace('222', '')


          0    1    2    3
a   Texas 1  111       333
b   Texas 1  444  555  666
c   Texas 2  777  888  999
  

И я хочу иметь возможность определять мультииндекс на основе значений первой строки, которые не являются пустыми.
Итак, что-то вроде этого:

       0     1    3
Texas 1   111  333 444  555  666
Texas 2   111  333 777  888  999
  

Проблема в том, что значения в строке a не всегда будут находиться в одном столбце, поэтому мне нужен способ найти, какие столбцы имеют значение в первой строке, и использовать номер этого столбца в качестве индекса. До сих пор я читал свой файл Excel следующим образом:

 df1 = pd.read_excel('excel.XLS', index_col=[1,11,24,37])
  

И я искал способ прочитать ячейки, которые не являются NaN и находятся в row a , и найти их номер столбца для сохранения в списке и использовать его как для моего index_col=() . Но я не могу понять, как. Любые указатели в правильном направлении были бы потрясающими!

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

1. Я просто не понимаю, чего вы хотите

2. @Noobie Я хочу иметь возможность сохранять в list номер столбца для каждой ячейки, в Row a которой нет NaN . Таким образом, я смогу указать, какие столбцы я хочу использовать в качестве мультииндекса, поскольку столбцы не всегда будут одинаковыми

Ответ №1:

прежде всего, вы говорите «где не NaN», но вы replace с '' .
Я заменю '' на np.nan then dropna

 df.iloc[0].replace('', np.nan).dropna().index

Int64Index([0, 1, 3], dtype='int64')
  

 df[df.iloc[0].replace('', np.nan).dropna().index]
  

введите описание изображения здесь

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

1. Спасибо, df[df.iloc[0].replace('', np.nan).dropna().index] это то, что мне было нужно. Я использовал df , который это создало, чтобы получить list столбцы, которые имеют значения в первой строке (или второй из-за заголовка), а затем я использовал это в df1 = pd.read_excel('excel.XLS', index_col=[1,11,24,37]) для замены index_col значений. Это сработало

2. @rubito подумайте о том, чтобы отметить это как ответ, если вы считаете, что это уместно.