#python #pandas
Вопрос:
Я хотел бы превратить имена столбцов в значения. Это делается для создания факторной переменной и определения уровней в качестве имен столбцов. Я надеюсь добиться x2
от x1
. В R это было бы похоже на использование model.matrix()
функции
Спасибо
x1 = pd.DataFrame({'A': [1,0,0],
'B': [0,1,0],
'C': [0,1,1]})
x2 = pd.DataFrame({'All': ['A','BC','C']})
Комментарии:
1. Почему
BC
? Объясните логику вывода2. тема 1 появляется как в B, так и в C, поэтому для этого необходимо учитывать уровень.
Ответ №1:
Вы также можете использовать понимание списка следующим образом:
cols = x1.columns.values
x2 = pd.DataFrame({'All': [''.join(cols[x]) for x in x1.eq(1).values]})
Или просто:
x2 = pd.DataFrame({'All': [''.join(x1.columns[x]) for x in x1.eq(1).values]})
Результат:
print(x2)
All
0 A
1 BC
2 C
Комментарии:
1. Это сработало для моих данных. Спасибо!
Ответ №2:
Это один из способов, должно быть более простое решение:
x1.astype(bool).apply(lambda row: ''.join(x1.columns[row]), axis=1)
Ответ №3:
Используйте @ (оператор умножения матрицы), чтобы умножить вектор столбцов на логическую матрицу:
import pandas as pd
x1 = pd.DataFrame({'A': [1, 0, 0],
'B': [0, 1, 0],
'C': [0, 1, 1]})
# create result DataFrame
x2 = pd.DataFrame({"all": x1 @ x1.columns})
print(x2)
Выход
all
0 A
1 BC
2 C
Комментарии:
1. Должен быть общепринятый ответ, действительно элегантный.