2017-02-16 60 views
1

如何可以通過np.nan在數據幀使用以下條件替代特定的值:如果一個列的值被重複在任何後續列,比第一次出現應用np.nan代替。如何濾除列(每行)重複值

例如,

VD_1 VD_2 VD_3  VD_4 
Test Sun  Test  None 
Sun  Sun  Fun  Fun 
Big  Sand Fun  Big 

的結果會是這樣:

VD _1 VD_2 VD_3 VD_4 
None Sun  Test None 
None Sun  None Fun 
None Sand Fun Big 

我應該使用drop_duplicateskeep等於last

+0

因此,它可能有少列?您可能需要一個新的DataFrame,而不是「替換」這些值。 –

+0

@XinHuang:是的,也可能是與無相同數量的列。查看我的更新。 – Dinosaurius

+0

@XinHuang:請參閱我的更新。我稍微簡化了它。 – Dinosaurius

回答

4

用途:


df = df.replace({'None':np.nan}) 
     .apply(lambda x:x.drop_duplicates(keep='last'), axis=1) 
     .reindex(columns=df.columns) 

print (df) 
    VD_1 VD_2 VD_3 VD_4 
0 NaN Sun Test NaN 
1 NaN Sun NaN Fun 
2 NaN Sand Fun Big 
+0

是否有可能具有相同數量的列,只需將None而不是第一個副本,始終保持最後一個唯一值? – Dinosaurius

+0

看來是的,檢查編輯答案。 – jezrael

+0

太好了。非常感謝。 – Dinosaurius

1

首先轉置數據幀並使用drop_duplicates。這一個可以選擇保持最後的值。這必須爲每一列完成,然後將輸出連接在一起。

df_t= df_item.T 
clone= df_t[0].drop_duplicates(keep='last').tolist() 
cltwo= df_t[1].drop_duplicates(keep='last').tolist() 
cl3= df_t[2].drop_duplicates(keep='last').tolist() 

print pd.DataFrame([clone,cltwo,cl3]) 

輸出

0  1  2 
0 Sun Test None 
1 Sun Fun None 
2 Sand Fun Big 
+0

不錯。最終的解決方案可能與最初的數據框具有相同的列數? – Dinosaurius

+0

啊哈我看到你改變了預期的輸出:)。將檢查,如果這是可能的 – Shijo

+0

另外,是否有可能使用'lambda'來避免'clone','cltwo'等。如果我有100列? – Dinosaurius

1

我覺得這個意願的伎倆:

df = df.apply(lambda x: [x.values[i] if x.values[i] not in x.values[i+1:] else np.nan for i in range(len(x))], axis=1)