2017-07-15 4 views
2

ich ein sehr einfaches Datenrahmen in Pandas haben,imputieren fehlende Werte auf 0 und erstellen Anzeigesäulen in Pandas

testdf = [{'name' : 'id1', 'W': np.NaN, 'L': 0, 'D':0}, 
      {'name' : 'id2', 'W': 0, 'L': np.NaN, 'D':0}, 
      {'name' : 'id3', 'W': np.NaN, 'L': 10, 'D':0}, 
      {'name' : 'id4', 'W': 75, 'L': 20, 'D':0} 
      ] 
testdf = pd.DataFrame(testdf) 
testdf = testdf[['name', 'W', 'L', 'D']] 

, die wie folgt aussieht:

| name | W | L | D | 
|------|-----|-----|---| 
| id1 | NaN | 0 | 0 | 
| id2 | 0 | NaN | 0 | 
| id3 | NaN | 10 | 0 | 
| id4 | 75 | 20 | 0 | 

Mein Ziel ist einfach:
1) Ich möchte alle fehlenden Werte unterstellen, indem ich sie einfach durch 0 ersetze. 0)
2) Als nächstes möchte ich Indikatorspalten mit einer 0 oder 1 erstellen, um anzuzeigen, dass der neue Wert (die 0) tatsächlich durch die Imputation erzeugt wird Prozess.

Es ist wahrscheinlich einfacher zu zeigen, anstatt mit Worten zu erklären:

| name | W | W_indicator | L | L_indicator | D | D_indicator | 
|------|----|-------------|----|-------------|---|-------------| 
| id1 | 0 | 1   | 0 | 0   | 0 | 0   | 
| id2 | 0 | 0   | 0 | 1   | 0 | 0   | 
| id3 | 0 | 1   | 10 | 0   | 0 | 0   | 
| id4 | 75 | 0   | 20 | 0   | 0 | 0   | 

Meine Versuche sind gescheitert, da ich stecken versucht, alle nicht-NaN-Werte bis zu einem gewissen Platzhalter Wert zu ändern, dann alle NaNs ändern eine 0, dann ändere den Platzhalterwert auf NaN, etc. usw. Es wird so schnell unordentlich. Dann bekomme ich alle möglichen Scheibenwarnungen. Und die Masken werden alle durcheinander gebracht. Ich bin mir sicher, dass es einen viel eleganteren Weg gibt, dies zu tun als meine wackeligen heuristischen Methoden.

+0

Wenn meine Antwort hilfreich war, vergessen Sie nicht "akzeptieren" Sie es. Vielen Dank. (Und auch Sie können verbundene Frage und große Antworten überprüfen und sie auffrischen) – jezrael

+0

Ja, Sir, ich bin dabei –

Antwort

1

können Sie isnull mit convert durch eine Lösung aus this answers erstellt int von astype und add_prefix für neue df und dann concat mit reindex_axis von cols verwenden:

cols = ['W','L','D'] 
df = testdf[cols].isnull().astype(int).add_suffix('_indicator') 
print (df) 
    W_indicator L_indicator D_indicator 
0   1   0   0 
1   0   1   0 
2   1   0   0 
3   0   0   0 

Lösung mit generator:

def mygen(lst): 
    for item in lst: 
     yield item 
     yield item + '_indicator' 

df1 = pd.concat([testdf.fillna(0), df], axis=1) \ 
     .reindex_axis(['name'] + list(mygen(cols)), axis=1) 
print (df1) 

    name  W W_indicator  L L_indicator D D_indicator 
0 id1 0.0   1 0.0   0 0   0 
1 id2 0.0   0 0.0   1 0   0 
2 id3 0.0   1 10.0   0 0   0 
3 id4 75.0   0 20.0   0 0   0 

Und Lösung mit list comprehenion:

cols = ['name'] + [item for x in cols for item in (x, x + '_indicator')] 
df1 = pd.concat([testdf.fillna(0), df], axis=1).reindex_axis(cols, axis=1) 
print (df1) 
    name  W W_indicator  L L_indicator D D_indicator 
0 id1 0.0   1 0.0   0 0   0 
1 id2 0.0   0 0.0   1 0   0 
2 id3 0.0   1 10.0   0 0   0 
3 id4 75.0   0 20.0   0 0   0 
Verwandte Themen