import numpy as np
import pandas as pd
cols = np.array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'temp'])
df = pd.DataFrame(columns=cols[:-1])
df['Z'] = [9,1,2,3,1,5,4]
df = df.fillna(0)
df.update(pd.get_dummies(cols[df['Z']]))
print(df)
доходность
A B C D E F G H I Z
0 0 0 0 0 0 0 0 0 0 9
1 0 1 0 0 0 0 0 0 0 1
2 0 0 1 0 0 0 0 0 0 2
3 0 0 0 1 0 0 0 0 0 3
4 0 1 0 0 0 0 0 0 0 1
5 0 0 0 0 0 1 0 0 0 5
6 0 0 0 0 1 0 0 0 0 4
У Pandas есть функция pd.get_dummies , которая делает именно то, что вы хотите:
In [274]: pd.get_dummies(['A','C','B','D'])
Out[274]:
A B C D
0 1 0 0 0
1 0 0 1 0
2 0 1 0 0
3 0 0 0 1
Сделав cols
массив NumPy, вы можете использовать Индексирование целочисленного массива NumPy для генерации желаемых меток столбцов.(Назначение столбца 'temp'
поясняется ниже):
In [276]: cols[df['Z']]
Out[276]: array(['temp', 'B', 'C', 'D', 'B', 'F', 'E'], dtype='<U3')
Чтобы get_dummies
генерировал этот DataFrame:
In [277]: pd.get_dummies(cols[df['Z']])
Out[277]:
B C D E F temp
0 0 0 0 0 0 1
1 1 0 0 0 0 0
2 0 1 0 0 0 0
3 0 0 1 0 0 0
4 1 0 0 0 0 0
5 0 0 0 0 1 0
6 0 0 0 1 0 0
df.update(other)
копирует не-NaN значения изother
DataFrame в df
.Поскольку df
не имеет столбца, помеченного temp
, значения в этом столбце игнорируются.
В качестве альтернативы можно создать df
путем объединения df['Z']
с pd.get_dummies(cols[df['Z']])
:
import numpy as np
import pandas as pd
cols = np.array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'temp'])
df = pd.DataFrame({'Z':[9,1,2,3,1,5,4]})
df = pd.concat([pd.get_dummies(cols[df['Z']]), df['Z']], axis=1)
df = df.drop('temp', axis=1)
print(df)
возвращает
B C D E F Z
0 0 0 0 0 0 9
1 1 0 0 0 0 1
2 0 1 0 0 0 2
3 0 0 1 0 0 3
4 1 0 0 0 0 1
5 0 0 0 0 1 5
6 0 0 0 1 0 4
Обратите внимание, что некоторые столбцы могут отсутствовать, если в столбце Z
нет соответствующего ему значения.