2017-07-15 53 views
2

創建指標列我有熊貓一個非常簡單的數據幀,它看起來像這樣填充缺失值設置爲0,並在熊貓

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']] 

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

我的目標很簡單:
1)我想通過簡單地將它們替換爲0來將所有缺失值進行歸一化。
2)接下來,我想創建具有0或1的指示符列,以指示新值(0)確實是由插補創建的流程。

它可能更容易只顯示而不是用文字解釋:

| 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   | 

我的嘗試都失敗了,因爲我被卡住試圖改變所有非NaN值的一些佔位符值,然後更改所有的NaN到一個0,然後將佔位符的值改回NaN等等等等。它太雜亂了。然後我不斷收到各種切片警告。面具變得雜亂無章。我敢肯定,比起我那些不可靠的啓發式方法,有更好的方法來做到這一點。

+0

如果我的回答很有幫助,別忘了接受它。謝謝。 (也可以檢查鏈接的問題和很好的答案,並把它們加起來) – jezrael

+0

是的先生我在上面 –

回答

1

您可以通過astypeadd_prefixdf由一些解決方案中創建colsthis answers使用isnull與轉換爲int,然後concatreindex_axis

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 

解決方案與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 

並與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