使用pyspark dataframe,如何做等同于Pandas的df['col'].unique()
.
我想列出pyspark dataframe列中所有唯一的值。
不是SQL类型的方式(registertemplate然后SQL查询不同的值)。
我也不需要groupby
然后countDistinct
,相反,我想检查不同的值在该列
这应该有助于获得不同的列值:
df.select('column1').distinct().collect()
请注意,.collect()
没有任何内置限制多少值可以返回,所以这可能会很慢-使用.show()
代替或添加.limit(20)
之前.collect()
来管理这个
让我们假设我们正在使用以下数据表示(两列,k
和v
,其中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)