#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(', ')