two spark inner dataframes data python pandas duplicates multiple-columns spark-dataframe

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