我试图从熊猫数据框中获取最大值Alphabet。我对它来自哪个行或列不感兴趣。我只对数据帧中的单个最大值感兴趣。
这就是它的样子:
id conditionName
1 C
2 b
3 A
4 A
5 A
预期结果是:
|id|conditionName|
+--+-------------+
| 3| A |
| 4| A |
| 5| A |
+----------------+
因为'A'是字母表中的第一个字母
df= df.withColumn("conditionName", col("conditionName").cast("String")) .groupBy("id,conditionName").max("conditionName"); df.show(false);
异常:“conditionName”不是数字列。聚合函数只能应用于数字列。
我需要整个数据帧字母字符的最大值。 我应该使用什么,以达到预期的效果?
感谢提前!
答案 0 :(得分:0)
您可以按字符串列对DataFrame
进行排序,抓取第一个值并使用它来过滤原始数据:
from pyspark.sql.functions import lower, desc, first
# we need lower() because ordering strings is case sensitive
first_letter = df.orderBy((lower(df["condition"]))) \
.groupBy() \
.agg(first("condition").alias("condition")) \
.collect()[0][0]
df.filter(df["condition"] == first_letter).show()
#+---+---------+
#| id|condition|
#+---+---------+
#| 3| A|
#| 4| A|
#| 5| A|
#+---+---------+
或者更优雅地使用Spark SQL
:
df.registerTempTable("table")
sqlContext.sql("SELECT *
FROM table
WHERE lower(condition) = (SELECT min(lower(condition))
FROM table)
")