объединение имен столбцов в новых столбцах pandas при условии значения

#python #pandas #join

#python #pandas #Присоединиться

Вопрос:

У меня есть следующий набор данных:

 data = {'Environment': ['0', '0', '0'],
        'Health': ['1', '0', '1'],
            'Labor': ['1', '1', '1'],
             }

df = pd.DataFrame(data, columns=['Environment', 'Health', 'Labor']) 
  

Я хочу создать новый столбец df[‘Ключевое слово’], значение которого является объединением имен столбцов со значением > 0.

Ожидаемый результат:

 data = {'Environment': ['0', '0', '0'],
            'Health': ['1', '0', '1'],
                'Labor': ['1', '1', '1'],
                     'Keyword': ['Health, Labor', 'Labor', 'Health, Labor']}
    
df_test = pd.DataFrame(data, columns=['Environment', 'Health', 'Labor', 'Keyword']) 
df_test
df = pd.DataFrame(data, columns=['Environment', 'Health', 'Labor']) 
  

Как мне это сделать?

Ответ №1:

Другая версия с .apply() :

 df['Keyword'] = df.apply(lambda x: ', '.join(b for a, b in zip(x, x.index) if a=='1'),axis=1)
print(df)
  

С принтами:

   Environment Health Labor        Keyword
0           0      1     1  Health, Labor
1           0      0     1          Labor
2           0      1     1  Health, Labor
  

Ответ №2:

Другой метод с mask и stack затем groupby для получения вашей агрегации элементов.

stack по умолчанию отбрасывает значения na.

 df['keyword'] = df.mask(
               df.lt(1)).stack().reset_index(1)
                        .groupby(level=0)["level_1"].agg(list)

print(df)

   Environment  Health  Labor          keyword
0            0       1      1  [Health, Labor]
1            0       0      1          [Labor]
2            0       1      1  [Health, Labor]
  

Ответ №3:

Первая проблема в примерах значений данных — это строки, поэтому, если хотите, сравните для большего использования:

 df = df.astype(float).astype(int)
  

Или:

  df = df.replace({'0':0, '1':1})
  

А затем используйте DataFrame.dot для умножения матрицы с именами столбцов и разделителями, последний раз удалите его с правой стороны:

 df['Keyword'] = df.gt(0).dot(df.columns   ', ').str.rstrip(', ')
print (df)
   Environment  Health  Labor        Keyword
0            0       1      1  Health, Labor
1            0       0      1          Labor
2            0       1      1  Health, Labor
  

Или сравнение строк — например, не равно '0' или равно '1' :

 df['Keyword'] = df.ne('0').dot(df.columns   ', ').str.rstrip(', ')

df['Keyword'] = df.eq('1').dot(df.columns   ', ').str.rstrip(', ')