Reemplace valores duplicados en columnas en Pandas

Tengo un dataframe simple como tal:

df = [ {'col1' : 'A', 'col2': 'B', 'col3': 'C', 'col4':'0'}, {'col1' : 'M', 'col2': '0', 'col3': 'M', 'col4':'0'}, {'col1' : 'B', 'col2': 'B', 'col3': '0', 'col4':'B'}, {'col1' : 'X', 'col2': '0', 'col3': 'Y', 'col4':'0'} ] df = pd.DataFrame(df) df = df[['col1', 'col2', 'col3', 'col4']] df 

Que se parece a esto:

 | col1 | col2 | col3 | col4 | |------|------|------|------| | A | B | C | 0 | | M | 0 | M | 0 | | B | B | 0 | B | | X | 0 | Y | 0 | 

Solo quiero reemplazar los caracteres repetidos con el carácter ‘0’, en las filas. Se reduce a mantener el primer valor duplicado que encontramos, así:

 | col1 | col2 | col3 | col4 | |------|------|------|------| | A | B | C | 0 | | M | 0 | 0 | 0 | | B | 0 | 0 | 0 | | X | 0 | Y | 0 | 

Esto parece tan simple pero estoy atascado. Cualquier empujón en la dirección correcta sería realmente apreciado.

Puede usar el método duplicated para devolver un indexador booleano de si los elementos son duplicados o no:

 In [214]: pd.Series(['M', '0', 'M', '0']).duplicated() Out[214]: 0 False 1 False 2 True 3 True dtype: bool 

Luego, puede crear una máscara asignando esto a las filas de su dataframe y utilizando where realizar su sustitución:

 is_duplicate = df.apply(pd.Series.duplicated, axis=1) df.where(~is_duplicate, 0) col1 col2 col3 col4 0 ABC 0 1 M 0 0 0 2 B 0 0 0 3 X 0 Y 0