2017-10-26 4 views
1

ich die Daten wie folgt bekommen:Wie die entsprechen Spalten erstellen

import pandas as pd 

data_dict = {'a':[5,2,4,5,3,3,1,2,3], 
      'name':['Jack','jon',"tom",'lazzy','mack','zack','makilo','drag','maiko']} 
data_01 = pd.DataFrame(data_dict) 
input: 
    a name 
0 5 Jack 
1 2 jon 
2 4 tom 
3 5 lazzy 
4 3 mack 
5 3 zack 
6 1 makilo 
7 2 drag 
8 3 maiko 

ich die Ausgabe hoffen 'good','mid','poor' 3 Spalten sollte die der eine >3,==3,<3 Der erwarten ausgegeben werden soll:

a name good mid poor 
5 Jack 1 0 0 
2 jon 0 0 1 
4 tom 1 0 0 
5 lazzy 1 0 0 
3 mack 0 1 0 
.... 

Danke für die Hilfe !

Antwort

4
  • Ich werde np.sign auf verwenden data_01.a - 3
    • Das gibt -1 wenn < 3, 0 wenn == 3 und 1 wenn > 3
  • ich dies dann als Indizes auf einem Etikett verwenden Array

    labels = np.array(['mid', 'good', 'poor']) 
    
  • Als ich in Scheiben schneiden, die 0 Karten 'mid', 1 Karten 'good' und -1 Karten 'poor'

  • Schließlich verwende ich pd.get_dummies Dummy-Spalten zu erstellen.

labels = np.array(['mid', 'good', 'poor']) 

data_01.join(pd.get_dummies(labels[np.sign(data_01.a - 3)])) 

    a name good mid poor 
0 5 Jack  1 0  0 
1 2  jon  0 0  1 
2 4  tom  1 0  0 
3 5 lazzy  1 0  0 
4 3 mack  0 1  0 
5 3 zack  0 1  0 
6 1 makilo  0 0  1 
7 2 drag  0 0  1 
8 3 maiko  0 1  0 

Alternative 1
Dies verwendet np.eye die Dummy-Spalten zu erzeugen. Ich schaffe Wörterbuch die Dummies Etiketten zu binden und das Wörterbuch passieren zu pd.DataFrame.assign

dum = dict(zip(
    ['mid', 'good', 'poor'], 
    np.eye(3, dtype=int)[:, np.sign(data_01.a - 3)] 
)) 

data_01.assign(**dum) 

    a name good mid poor 
0 5 Jack  1 0  0 
1 2  jon  0 0  1 
2 4  tom  1 0  0 
3 5 lazzy  1 0  0 
4 3 mack  0 1  0 
5 3 zack  0 1  0 
6 1 makilo  0 0  1 
7 2 drag  0 0  1 
8 3 maiko  0 1  0 

Alternative 2
ich np.eye wieder verwenden, aber dieses Mal schaffe ich von Grund auf einen Datenrahmen und verwenden pd.DataFrame.join zu befestigen Sie es an data_01

dum = pd.DataFrame(
    np.eye(3, dtype=int)[np.sign(data_01.a - 3)], 
    data_01.index, ['mid', 'good', 'poor'] 
) 

data_01.join(dum) 

    a name mid good poor 
0 5 Jack 0  1  0 
1 2  jon 0  0  1 
2 4  tom 0  1  0 
3 5 lazzy 0  1  0 
4 3 mack 1  0  0 
5 3 zack 1  0  0 
6 1 makilo 0  0  1 
7 2 drag 0  0  1 
8 3 maiko 1  0  0 
+1

Ha, schlug mich von Meilen! –

+0

Nun, ich tue besser deine Antwort Gerechtigkeit und erkläre mich ein wenig mehr (-: – piRSquared

+1

Auch die Verwendung von -1, 0 und 1 in Etiketten zu indizieren ist sehr netter Trick, muss daran denken! –

2

Wenn benötigen Zählwerte:

s = np.select([data_01['a'] < 3, data_01['a'] > 3], ['poor','good'], default='mid') 

df = data_01.join(data_01.groupby(['name', s]).size().unstack(fill_value=0), on='name') 
print (df) 
    a name good mid poor 
0 5 Jack  1 0  0 
1 2  jon  0 0  1 
2 4  tom  1 0  0 
3 5 lazzy  1 0  0 
4 3 mack  0 1  0 
5 3 zack  0 1  0 
6 1 makilo  0 0  1 
7 2 drag  0 0  1 
8 3 maiko  0 1  0 
1

tun Sie einfach einige Vergleiche mit numpy:

arr_a = np.array(a) 

good = arr_a > 3 
mid = arr_a == 3 
poor = arr_a < 3 

diese Arrays auf Ihre Datenrahmen als Spalten Dann anhängen.

1

Einen anderen Weg, dies zu tun, können Sie numpy.wo die Spalten bedingt

erhalten bevölkerten
import pandas as pd 
import numpy as np 
data_dict = {'a':[5,2,4,5,3,3,1,2,3], 
      'name':['Jack','jon',"tom",'lazzy','mack','zack','makilo','drag','maiko']} 

data_01 = pd.DataFrame(data_dict) 

#This will create columns 'good','mid','poor' all with default values '0' 

data_01['good']=0 
data_01['mid']=0 
data_01['poor']=0 

#Here you are setting each column with value '1' , based on the condition 

data_01['good']=np.where(data_01['a'] > 3,1, data_01['good']) 
data_01['mid']=np.where(data_01['a'] == 3,1, data_01['mid']) 
data_01['poor']=np.where(data_01['a'] < 3,1, data_01['poor']) 
print data_01 

Ausgang ist

a name good mid poor 
0 5 Jack  1 0  0 
1 2  jon  0 0  1 
2 4  tom  1 0  0 
3 5 lazzy  1 0  0 
4 3 mack  0 1  0 
5 3 zack  0 1  0 
6 1 makilo  0 0  1 
7 2 drag  0 0  1 
8 3 maiko  0 1  0 
Verwandte Themen