2017-02-16 47 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)