Панды получают одну горячую кодировку из столбца как логическое значение - PullRequest
3 голосов
/ 25 июня 2019

Я рассматриваю Pandas Dataframe.Я хотел бы найти эффективный способ создания второго Dataframe.

import pandas as pd
data = {"column":[0,1,2,0,1,2,0]}   
df = pd.DataFrame(data) 
column
0
1
2
0
1
2
0
column0  column1 column2
true      false     false
false      true     false
false      false     true
true      false     false
false      true     false
false      false     true
true      false     false

Ответы [ 3 ]

7 голосов
/ 25 июня 2019

Это проблема get_dummies, но вам также нужно указать dtype=bool, чтобы получить столбцы bools:

pd.get_dummies(df['column'], dtype=bool)                                                                                                  
       0      1      2
0   True  False  False
1  False   True  False
2  False  False   True
3   True  False  False
4  False   True  False
5  False  False   True
6   True  False  False

pd.get_dummies(df['column'], dtype=bool).dtypes                                                                                          
0    bool
1    bool
2    bool
dtype: object

# carbon copy of expected output
dummies = pd.get_dummies(df['column'], dtype=bool)
dummies[:] = np.where(pd.get_dummies(df['column'], dtype=bool), 'true', 'false')  

dummies.add_prefix('column')
  column0 column1 column2
0    true   false   false
1   false    true   false
2   false   false    true
3    true   false   false
4   false    true   false
5   false   false    true
6    true   false   false
2 голосов
/ 25 июня 2019

Я также использую get_dummies как cs95.Тем не менее, я использую str.get_dummies и объединяю слово column перед get_dummies.Наконец, replace

('column'+df.column.astype(str)).str.get_dummies().replace({1:'true', 0:'false'})


Out[2164]:
  column0 column1 column2
0    true   false   false
1   false    true   false
2   false   false    true
3    true   false   false
4   false    true   false
5   false   false    true
6    true   false   false
1 голос
/ 25 июня 2019

factorize и назначение среза

i, u = pd.factorize(df.column)

a = np.empty((len(i), len(u)), '<U5')
a.fill('false')
a[np.arange(len(i)), i] = 'true'

pd.DataFrame(a).add_prefix('column')

  column0 column1 column2
0    true   false   false
1   false    true   false
2   false   false    true
3    true   false   false
4   false    true   false
5   false   false    true
6    true   false   false
...