Как я могу сопоставить заголовки столбцам в пандах?

У меня есть dataframe, как:

ABC 1 0 0 1 1 0 0 1 0 0 0 1 

Я хочу иметь :

  ABC label 1 0 0 A 1 1 0 AB 0 1 0 B 0 0 1 C 

Я пытался сделать карту или применить, но я не мог понять.

5 Solutions collect form web for “Как я могу сопоставить заголовки столбцам в пандах?”

 df = df.assign(label=[''.join([df.columns[n] for n, bool in enumerate(row) if bool]) for _, row in df.iterrows()]) >>> df ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

Задержки

 # Set-up: df_ = pd.concat([df] * 10000) %%timeit # Solution by @Wen df1 = df_.reset_index().melt('index') df1 = df1[df1.value==1] df['label'] = df1.groupby('index').variable.sum() # 10 loops, best of 3: 47.6 ms per loop %%timeit # Solution by @MaxU df_['label'] = df_.apply(lambda x: ''.join(df_.columns[x.astype(bool)].tolist()), axis=1) # 1 loop, best of 3: 4.99 s per loop %%timeit # Solution by @TedPetrou df_['label'] = np.where(df_, df_.columns, '').sum(axis=1) # 100 loops, best of 3: 12.5 ms per loop %%timeit # Solution by @Alexander df_['label'] = [''.join([df_.columns[n] for n, bool in enumerate(row) if bool]) for _, row in df_.iterrows()] # 1 loop, best of 3: 3.75 s per loop %%time # Solution by @PiRSquared df_['label'] = df_.dot(df_.columns) # CPU times: user 18.1 ms, sys: 706 µs, total: 18.8 ms # Wall time: 18.9 ms 

Вот идиоматическое и эффективное решение

 df['label'] = np.where(df, df.columns, '').sum(axis=1) ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

Использование dot

 df.assign(label=df.dot(df.columns)) ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

То же самое, используя базовые массивы numpy

 df.assign(label=df.values.dot(df.columns.values)) ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

Или используя melt и groupby

 df1 = df.reset_index().melt('index') df1 = df1[df1.value==1] df['label'] = df1.groupby('index').variable.sum() df Out[976]: ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

Или

 df['label'] = df.T.apply(lambda x: ''.join(x.index[x==1]),axis=0) df Out[984]: ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 
 In [101]: df['label'] = df.apply(lambda x: ''.join(df.columns[x.astype(bool)].tolist()), axis=1) In [102]: df Out[102]: ABC label 0 1 0 0 A 1 1 1 0 AB 2 0 1 0 B 3 0 0 1 C 

PS я определенно выбрал решение Ted, так как он намного приятнее и многого … быстрее

  • преобразовать фрейм данных python в список
  • Как удалить несколько фреймов pandas (python) из памяти, чтобы сохранить RAM?
  • Найти значения списка не в данных dataframe pandas
  • Преимущества мультииндекса panda?
  • Понимание этого сценария Pandas
  • Python, pandas: как отсортировать данные по индексу
  • Различные std в pandas vs numpy
  • panda dataframe удалить постоянный столбец
  •  
    Interesting Posts for Van-Lav

    Двумерная свертка и корреляция на основе FFT в Python

    Почему Python 2.6 не устанавливает литералов и понятий, а также не понимает диктофон?

    Должен ли я использовать `app.exec ()` или `app.exec _ ()` в моем приложении PyQt?

    Администратор Django меняет форму загрузки довольно медленно

    Умножая только один столбец из каждого из двух входных DataFrames вместе

    Объединение нескольких файлов в один файловый объект без создания нового файла

    Запрос массива NumPy массивов NumPy, сохраненных как npz, медленный

    Установка numpy Lion с Python 2.7?

    import webapp2 работает на google-app-engine, хотя у меня нет установленного webapp2

    В чем разница между mat и matND?

    Счетчик Django в цикле в индексный список

    Импортировать urllib или urllib 2 в Python 2.7 с помощью ImportError: невозможно импортировать имя iskeyword

    Как заставить CMake выполнить некоторый скрипт после того, как он создает визуальное студийное решение

    Оценка условной вероятности плотности в python

    анализ имен n-грамм на неанглийских языках (CJK и т. д.)

    Python - лучший язык программирования в мире.