Я рассматриваю 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
Stefano Barone 25 Июн 2019 в 19:40

3 ответа

Лучший ответ

Это проблема 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
7
cs95 25 Июн 2019 в 16:44

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
1
piRSquared 25 Июн 2019 в 18:43

Я также использую 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
2
Andy L. 25 Июн 2019 в 17:09