2017-05-25 168 views
2

假設我有一個這樣的數據框對象:Python熊貓。列替換值

age_diff result 
     1   0 
     -1   1 
     0   1 

我想通過向他們abs功能,以取代age_diff列負值。另外,如果age_diff中的值更改,則應切換result列中的值(如果它是0,則爲1,否則爲0)。

這種轉變後數據框,上面顯示,應該是這樣的:

age_diff result 
     1   0 
     1   0 
     0   1 

可以,任何人,我指向我如何才能做到這一點?

回答

5

使用abs + mask + map通過dict

print (df) 
    age_diff result 
0   1  0 
1  -1  0 
2  -1  1 
3   0  1 


mask = df['age_diff'] < 0 
df['age_diff'] = df['age_diff'].abs() 
df['result'] = df['result'].mask(mask, df['result'].map({0:1, 1:0})) 
print (df) 
    age_diff result 
0   1  0 
1   1  1 
2   1  0 
3   0  1 

另一個解決方案 - 而不是地圖由~轉換爲bool和反轉:

mask = df['age_diff'] < 0 
df['age_diff'] = df['age_diff'].abs() 
df['result'] = df['result'].mask(mask, ~(df['result'].astype(bool))) 
print (df) 
    age_diff result 
0   1  0 
1   1  1 
2   1  0 
3   0  1 
+0

超級,高興可以幫忙。美好的一天! – jezrael

2

您可以在應用功能的另一種方法:

def magic(row): 
    if abs(row['age_diff']) != row['age_diff']: 
     row['age_diff'] = abs(row['age_diff']) 
     row['result'] = 1 - row['result'] 
    return row 

df = df.apply(magic,axis=1) 
1

我得到age_diffnp.sign的跡象,並從那裏操縱。

s = np.sign(df.age_diff.values) 

df.age_diff *= s 
df.result -= (s == -1) 

print(df) 

    age_diff result 
0   1  0 
1   1  0 
2   0  1 
1

使用lambda得到age_diff的腹肌,然後更改結果的跡象,如果age_diff是一個否定的一個班輪解決方案。

df.apply(lambda x: [abs(x.age_diff),abs((x.age_diff<0) - x.result)],axis=1) 
Out[165]: 
    age_diff result 
0   1  0 
1   1  0 
2   0  1