python - inner - spark join dataframes
¿Cómo eliminar columnas que tienen los mismos valores en todas las filas a través de pandas o chispa de datos? (2)
Supongamos que tengo datos similares a los siguientes:
index id name value value2 value3 data1 val5
0 345 name1 1 99 23 3 66
1 12 name2 1 99 23 2 66
5 2 name6 1 99 23 7 66
¿Cómo podemos eliminar todas esas columnas como ( value
, value3
, value3
) donde todas las filas tienen los mismos valores, en un comando o en un par de comandos que utilizan python ?
Considere que tenemos muchas columnas similares a value
, value3
, value3
... value200
.
Salida:
index id name data1
0 345 name1 3
1 12 name2 2
5 2 name6 7
Lo que podemos hacer es apply
nunique
para nunique
el número de valores únicos en el df y eliminar las columnas que solo tienen un único valor único:
In [285]:
nunique = df.apply(pd.Series.nunique)
cols_to_drop = nunique[nunique == 1].index
df.drop(cols_to_drop, axis=1)
Out[285]:
index id name data1
0 0 345 name1 3
1 1 12 name2 2
2 5 2 name6 7
Otra forma es simplemente diff
las columnas numéricas y sums
:
In [298]:
cols = df.select_dtypes([np.number]).columns
diff = df[cols].diff().sum()
df.drop(diff[diff== 0].index, axis=1)
Out[298]:
index id name data1
0 0 345 name1 3
1 1 12 name2 2
2 5 2 name6 7
Otro enfoque es usar la propiedad de que la desviación estándar será cero para una columna con el mismo valor:
In [300]:
cols = df.select_dtypes([np.number]).columns
std = df[cols].std()
cols_to_drop = std[std==0].index
df.drop(cols_to_drop, axis=1)
Out[300]:
index id name data1
0 0 345 name1 3
1 1 12 name2 2
2 5 2 name6 7
En realidad, lo anterior se puede hacer en una sola línea:
In [306]:
df.drop(df.std()[(df.std() == 0)].index, axis=1)
Out[306]:
index id name data1
0 0 345 name1 3
1 1 12 name2 2
2 5 2 name6 7
Otra solución es set_index
de la columna que no se compara y luego compara la primera fila seleccionada por iloc
por eq
con todos los DataFrame
y el último uso de la boolean indexing
:
df1 = df.set_index([''index'',''id'',''name'',])
print (~df1.eq(df1.iloc[0]).all())
value False
value2 False
value3 False
data1 True
val5 False
dtype: bool
print (df1.ix[:, (~df1.eq(df1.iloc[0]).all())].reset_index())
index id name data1
0 0 345 name1 3
1 1 12 name2 2
2 5 2 name6 7