2015-10-16 49 views
1

我有這樣一個大熊貓數據幀:更換項目值

dx1  dx2 dx3  dx4  dxpoa1 dxpoa2 dxpoa3 dxpoa4 
25041 40391     Y  E  
25041 40391 25081   N  W  U  
25041 40391 42822 99681 1  N  Y  Y 

有兩組列組成:dx和dxpoa。根據dxpoa中的某些值,我必須保留dx中的值或放棄它。在dx中敵對每個值,在該行中對應的dxpoa中存在一個值。例如:如果dxpoa = ['Y'或'W'或'1'或'E'],則將dx值保留在相應的行中,否則將其丟棄或填充0.與第一行中的dxpoa1一樣,因此dx1將保持原樣。但是dxpoa1,在第二排,是 'N' DX1的結果,相當於價值第二行,就會變成0

+0

你已經試過了嗎?你在那裏遇到什麼問題嗎? –

+0

@AnandSKumar:我可以更改某一列的值,但不知道如何遍歷行或列。我正在嘗試使用iterrow()函數。但對python知之甚少。 – Sanoj

回答

1

這裏是看它(使用@ VMG的方便的起始幀)的矢量方式:

>>> N = len(df.columns) 
>>> keep = df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values 
>>> df.iloc[:,:N//2] = df.iloc[:,:N//2].where(keep, 0) 
>>> df 
    dx1 dx2 dx3 dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 25041 40391  0  0  Y  E NaN NaN 
1  0 40391  0  0  N  W  U NaN 
2 25041  0 42822 99681  1  N  Y  Y 

這樣做是什麼讓真假的數組,最後N // 2列,如此,其中值是在列表中,假它不是(還請注意,我假設1是字符串"1"而不是整數1):

>>> df.iloc[:,-N//2:] 
    dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0  Y  E NaN NaN 
1  N  W  U NaN 
2  1  N  Y  Y 
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]) 
    dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 True True False False 
1 False True False False 
2 True False True True 
>>> df.iloc[:,-N//2:].isin(["Y", "W", "1", "E"]).values 
array([[ True, True, False, False], 
     [False, True, False, False], 
     [ True, False, True, True]], dtype=bool) 

然後,我們可以使用where設置第一ñ// 2列的值,保持在那裏keep是真,否則替換值他們與0.

2

給定一個數據幀建立像這樣:

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'dx1':[25041,25041,25041], 
        'dx2':[40391,40391,40391], 
        'dx3':[np.nan,25081,42822], 
        'dx4':[np.nan,np.nan,99681], 
        'dxpoa1':['Y','N','1'], 
        'dxpoa2':['E','W','N'], 
        'dxpoa3':[np.nan,'U','Y'], 
        'dxpoa4':[np.nan,np.nan,'Y']}) 

其中給出:

dx1  dx2  dx3  dx4 dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 25041 40391 NaN  NaN  Y  E  NaN  NaN 
1 25041 40391 25081 NaN  N  W  U  NaN 
2 25041 40391 42822 99681 1  N  Y  Y 

定義一個實現替代規則的函數。這是用零替換目標列時在基準列中的值不是「Y」,「W」,「1」或「E」,正如我從描述中可以理解:

def subfunc(row,col_reference=None,col_target=None): 
    if not row[col_reference] in ['Y','W','1','E']: 
     row[col_target] = 0 
    return row 

然後遍歷應用subfunc在每個行的列名:

for colname in df.columns: 
    if 'dxpoa' in colname: 
     colid = colname.split('dxpoa')[1] 
     df = df.apply(subfunc,axis=1,col_reference=colname,col_target='dx'+colid) 

結果在數據幀

dx1  dx2  dx3  dx4  dxpoa1 dxpoa2 dxpoa3 dxpoa4 
0 25041 40391 0  0  Y  E  NaN  NaN 
1 0  40391 0  0  N  W  U  NaN 
2 25041 0  42822 99681 1  N  Y  Y