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

У меня есть 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, так как он намного приятнее и многого … быстрее

  • HDFStore: table.select и использование ОЗУ
  • «gcc» не удалось во время создания панд на AWS Elastic Beanstalk
  • picountries: конвертировать названия стран (возможно, неполные!) в CountryCodes
  • Замена NaT на Эпоху в Пандах
  • Условно выполнить расчет на базе данных панд
  • Использование имени столбца в качестве нового атрибута в пандах
  • Почему у меня нет xlrd?
  • создать новый столбец в области данных с помощью fuzzywuzzy
  • Python - лучший язык программирования в мире.