Supongamos que estamos trabajando con la siguiente representación de datos (dos columnas k
y v
, donde k
contiene tres entradas, dos únicas:
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
|foo| 3|
+---+---+
Con un marco de datos de Pandas:
import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()
Esto devuelve un ndarray
, es decirarray(['foo', 'bar'], dtype=object)
Solicitó una "alternativa de marco de datos pyspark para pandas df ['col']. Unique ()". Ahora, dado el siguiente marco de datos de Spark:
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
Si desea el mismo resultado de Spark, es decir ndarray
, use toPandas()
:
s_df.toPandas()['k'].unique()
Alternativamente, si no necesita ndarray
específicamente y solo desea una lista de los valores únicos de la columna k
:
s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()
Finalmente, también puede usar una lista de comprensión de la siguiente manera:
[i.k for i in s_df.select('k').distinct().collect()]
.rdd
llamada despuésdistinct()
. Funcionó sin eso en Spark 1.6.2, pero acabo de confirmar que la respuesta editada también funciona en Spark 2.0.0.Esto debería ayudar a obtener valores distintos de una columna:
df.select('column1').distinct().collect()
Tenga en cuenta que
.collect()
no tiene ningún límite incorporado sobre la cantidad de valores que pueden devolver, por lo que esto podría ser lento; use.show()
en su lugar o agregue.limit(20)
antes.collect()
para administrar esto.fuente
Puede usar
df.dropDuplicates(['col1','col2'])
para obtener solo filas distintas basadas en colX en la matriz.fuente
collect_set puede ayudar a obtener valores únicos de una columna determinada de pyspark.sql.DataFrame
df.select(F.collect_set("column").alias("column")).first()["column"]
fuente
Si desea seleccionar TODOS los datos (columnas) como distintos de un DataFrame (df), entonces
df.select('*').distinct().show(10,truncate=False)
fuente
Podrías hacerlo
distinct_column = 'somecol' distinct_column_vals = df.select(distinct_column).distinct().collect() distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]
fuente
Además de la
dropDuplicates
opción, existe el método denominado como lo conocemos en :pandas
drop_duplicates
Ejemplo
s_df = sqlContext.createDataFrame([("foo", 1), ("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v')) s_df.show() +---+---+ | k| v| +---+---+ |foo| 1| |foo| 1| |bar| 2| |foo| 3| +---+---+
Gota por subconjunto
s_df.drop_duplicates(subset = ['k']).show() +---+---+ | k| v| +---+---+ |bar| 2| |foo| 1| +---+---+ s_df.drop_duplicates().show() +---+---+ | k| v| +---+---+ |bar| 2| |foo| 3| |foo| 1| +---+---+
fuente
Ejecuta esto primero
df.createOrReplaceTempView('df')
Entonces corre
spark.sql(""" SELECT distinct column name FROM df """).show()
fuente
Si desea ver los valores distintos de una columna específica en su marco de datos, solo necesitaría escribir:
df.select('colname').distinct().show(100,False)
Esto mostraría los 100 valores distintos (si hay 100 valores disponibles) para la columna colname en el marco de datos df.
Si desea hacer algo elegante con los valores distintos, puede guardar los valores distintos en un vector
a = df.select('colname').distinct()
Aquí, a tendría todos los valores distintos de la columna colname
fuente