在pyspark数据框中显示不同的列值



使用pyspark dataframe,如何做等同于Pandas的df['col'].unique() .

我想列出pyspark dataframe列中所有唯一的值。

不是SQL类型的方式(registertemplate然后SQL查询不同的值)。

我也不需要groupby然后countDistinct,相反,我想检查不同的值在该列

这应该有助于获得不同的列值:

df.select('column1').distinct().collect()

请注意,.collect()没有任何内置限制多少值可以返回,所以这可能会很慢-使用.show()代替或添加.limit(20)之前.collect()来管理这个

让我们假设我们正在使用以下数据表示(两列,kv,其中k包含三个条目,两个唯一:

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+

使用Pandas数据框架:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()

返回ndarray,即array(['foo', 'bar'], dtype=object)

您要求为pandas (df['col'].unique()"提供一个"pyspark数据框架替代方案。现在,给定以下Spark数据框架:

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))

如果你想从Spark得到相同的结果,即ndarray,使用toPandas():

s_df.toPandas()['k'].unique()

或者,如果您不特别需要ndarray,而只想要k列的唯一值的列表:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()

最后,还可以像下面这样使用列表推导式:

[i for i in s_df.select('k').distinct().collect()]

您可以使用df.dropDuplicates(['col1','col2'])仅根据数组中的colX获取不同的行。

如果要查看数据框架中特定列的不同值,只需编写以下代码。它将显示df数据框中colname列的100个不同的值(如果有100个值可用)。

df.select('colname').distinct().show(100, False)

如果你想在不同的值上做一些奇特的事情,你可以把不同的值保存在一个vector中:

a = df.select('colname').distinct()

collect_set可以帮助从pyspark.sql.DataFrame的给定列中获取唯一值:

df.select(F.collect_set("column").alias("column")).first()["column"]

你可以做

distinct_column = 'somecol' 
distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]

与其他答案类似,但问题似乎不希望返回Row对象,而是希望返回实际值。

理想的单行代码是df.select('column').distinct().collect().toPandas().column.to_list()假设运行.collect()不会占用太多内存

我建议首先使用df.select('column').distinct().count()来估计大小,并确保事先不会太大。

除了dropDuplicates选项之外,还有pandas: drop_duplicates:

drop_duplates () dropduplates ()的别名。

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|
+---+---+

Drop by子集

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|
+---+---+

如果要选择与DataFrame (df)不同的所有(列)数据,则

df.select('*').distinct().show(10,truncate=False)

第一次运行

df.createOrReplaceTempView('df')

然后运行

spark.sql("""
    SELECT distinct
        column name
    FROM
        df
    """).show()

我发现这是最直观的(即,类似于Pandas)语法:

new_df = df[['col']].distinct() # returns a one-column pyspark dataframe

new_col = df[['col']].distinct()['col'] # returns a pyspark column object. 

所以要把这些放到一个列表中,你需要:

new_list = df[['col']].distinct().rdd.map(lambda row: row.col).collect()

这可能会有帮助

df.select(collect_set("your column")).show()

假设您的原始DataFrame名为df。然后,您可以使用:

df1 = df.groupBy('column_1').agg(F.count('column_1').alias('trip_count'))
df2 = df1.sort(df1.trip_count.desc()).show()

我这样做了:

unique_values = df.select("col").distinct().rdd.flatMap(lambda x: x).collect()
print(unique_values)

相关内容

  • 没有找到相关文章

最新更新