2017-03-21 145 views
1

關於替換某些行或列或特定值有很多問題,但我沒有找到我在找什麼。 想像這樣一個數據幀,如何根據條件替換大熊貓數據框中的任何值?

  a   b   c   d 
a 0.354511 0.416929 0.704512 0.598345 
b 0.948605 0.473364 0.154856 0.637639 
c 0.250829 0.130928 0.682998 0.056049 
d 0.504516 0.880731 0.216192 0.314724 

現在我想換成基於與其他的東西(無論在哪個列或行而異)條件的所有值。假設我想用np.nan替換所有值< 0.5。 我已經嘗試了幾件事,沒有任何工作(即沒有發生,數據幀保持不變)。

例代碼在這裏:

frame = pd.DataFrame(np.random.rand(4,4),index=['a','b','c','d'], columns=['a','b','c','d']) 
print frame 
for row,col in enumerate(frame): 
    frame.replace(frame.ix[row,col]<0.5,np.nan,inplace=True) 
print frame 

for row,col in enumerate(frame): 
    if frame.ix[row,col]<=0.5: 
     M.ix[row,col]=np.nan 
print M 

但最終,

  a   b   c   d 
a 0.600701 0.823570 0.159012 0.615898 
b 0.234855 0.086080 0.950064 0.982248 
c 0.440625 0.960078 0.191975 0.598865 
d 0.127866 0.537867 0.434326 0.507635 
      a   b   c   d 
a 0.600701 0.823570 0.159012 0.615898 
b 0.234855 0.086080 0.950064 0.982248 
c 0.440625 0.960078 0.191975 0.598865 
d 0.127866 0.537867 0.434326 0.507635 

- 它們是相同的,沒有任何的NaN而不是小的值。哪裏有問題?

回答

6

pandas方法執行此操作的是wheremask

where保持數據幀值,其中所述病症是True
可選的第二個參數是值與

frame.where(frame < .5, -9) 

      a   b   c   d 
a 0.354511 0.416929 -9.000000 -9.000000 
b -9.000000 0.473364 0.154856 -9.000000 
c 0.250829 0.130928 -9.000000 0.056049 
d -9.000000 -9.000000 0.216192 0.314724 
取代

或姐姐見面HOD

mask保持數據框值中條件False
可選的第二個參數是值與

frame.mask(frame < .5, -9) 

      a   b   c   d 
a -9.000000 -9.000000 0.704512 0.598345 
b 0.948605 -9.000000 -9.000000 0.637639 
c -9.000000 -9.000000 0.682998 -9.000000 
d 0.504516 0.880731 -9.000000 -9.000000 

numpy.where
我們可以用它來代替numpy非常類似的效果

pd.DataFrame(
    np.where(frame < .5, df, -9), 
    frame.index, frame.columns) 

      a   b   c   d 
a 0.354511 0.416929 -9.000000 -9.000000 
b -9.000000 0.473364 0.154856 -9.000000 
c 0.250829 0.130928 -9.000000 0.056049 
d -9.000000 -9.000000 0.216192 0.314724 

天真一次測試時

enter image description here

1

啊,我明白了。我想到了。也許不是最優雅的解決方案,但它的工作原理。對於numpy數組,元素式操作可能更容易,所以我將幀轉換爲numpy數組,然後將其更改爲pandas數據框。就這麼簡單:

frame = np.asarray(frame) 
frame[frame<0.5] = np.nan 
frame = pd.DataFrame(frame,index=['a','b','c','d'], columns=['a','b','c','d']) 

這將返回所需的輸出

  a   b   c   d 
a 0.791982 0.654760 0.854503 0.552131 
b 0.545564  NaN 0.966512  NaN 
c 0.595927 0.540071 0.938315  NaN 
d  NaN 0.844594  NaN  NaN 

對不起,垃圾郵件提前。但如果有人遇到同樣的問題,我會保留在這裏。