2016-09-04 127 views
1

處理。如果我有這樣的熊貓數據:Python的大熊貓條件柱無

s1 s2 s3 
1 None 1 
1 2  1 
2 2  2 
1 2  None 

我想添加一個新列的「,其價值將是無如果S1的值,S2和S3唐不匹配。如果它們匹配(我想在此比較中忽略無),則該值應該是共同值。所以輸出將是

s1 s2 s3  s 
1 None 1  1  (Ignoring None in comparision here) 
1 2  1 None 
2 2  2  2 
1 2  None None 

什麼是最好的方式來引入這個新的條件列在熊貓?

回答

1

假設你的列是數字和無的被視爲NaN的,你可以這樣做:

df['s'] = np.where(df.std(axis=1)==0, df.mean(axis=1), np.nan) 

df 
Out: 
    s1 s2 s3 s 
0 1 NaN 1.0 1.0 
1 1 2.0 1.0 NaN 
2 2 2.0 2.0 2.0 
3 1 2.0 NaN NaN 

這是基於這樣的事實,如果所有的值相等,則該行的標準偏差爲0,平均數將等於這些數字。平均值和標準偏差計算均忽略NaN。

如果第一個假設是不正確的,請更換無上第:

df = df.replace({'None': np.nan}) 

其中NP是numpy的(import numpy as np)。

+0

原始數據包含很多列(包括我不想考慮的數字列),而且我只需要在特定列上執行此操作。有沒有一種簡單的方法可以只在特定列上執行std。看起來它是在整個軸上做的。 – Man

+0

而不是'df.std(axis = 1)',你可以傳遞一個列的子集,比如'df [['s1','s2']]。std(axis = 1)'(你需要這麼做所以它可能更容易創建一個副本:'df_sub = df [['s1','s2']]。copy()'並將其用於std和平均值計算。 – ayhan