2017-04-03 50 views
4

我有一個像如何實現大熊貓

df = pd.DataFrame({"A":[1,2,np.nan],"B":[np.nan,10,np.nan], "C":[5,10,7]}) 
    A  B C 
0 1.0 NaN 5 
1 2.0 10.0 10 
2 NaN NaN 7 

我想添加一個新列「d」一個數據幀SQL聚結。預計輸出是

 A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

在此先感謝!

+0

您的第一個代碼片段中'df'的值是錯誤的。你如何計算預期產出? – DyZ

回答

4

我認爲你需要bfilliloc選擇第一列:

df['D'] = df.bfill(axis=1).iloc[:,0] 
print (df) 
    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

一樣:

df['D'] = df.fillna(method='bfill',axis=1).iloc[:,0] 
print (df) 
    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 
3

選項1
pandas

df.assign(D=df.lookup(df.index, df.isnull().idxmin(1))) 

    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

選項2
numpy

v = df.values 
j = np.isnan(v).argmin(1) 
df.assign(D=v[np.arange(len(v)), j]) 

    A  B C D 
0 1.0 NaN 5 1.0 
1 2.0 10.0 10 2.0 
2 NaN NaN 7 7.0 

幼稚時間測試
超過給定的數據

enter image description here

在更大的數據

enter image description here

+0

@jezrael更新了帖子 – piRSquared

+0

如果我只想'A'和'C'創建'D',那麼我可以在哪裏指定它。請讓我知道 – Anoop

+0

@Anoop你可以在'df [['A','C']'''上運行這些方法。這對'numpy'方法特別有效。 'v = df [['A','C']]。值' – piRSquared

1

的另一種方式是明確地填充柱d與A,B,C的順序。

df['D'] = np.nan 
df['D'] = df.D.fillna(df.A).fillna(df.B).fillna(df.C)