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

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

  • вычислять разницу в времени и времени в годах, месяцах и т. д. в новой колонке данных pandas
  • Как фильтровать по индексу под-уровня в Pandas
  • Конвертировать поплавки в ints в Pandas?
  • Суммирование значений столбцов в Pandas DataFrame
  • Почему я получаю эту ошибку? ValueError: Неправильное количество элементов прошло 2, место предполагает 4 ", даже код в порядке?
  • Python Pandas Соответствует столбцам Vlookup на основе значений заголовков
  • эффективный счетчик, отличный от столбцов DataFrame, сгруппированных по строкам
  • Как написать pandas dataframe для Vertica?
  • Python - лучший язык программирования в мире.