使用Spark DataFrame列制作直方图

时间:2016-03-16 17:50:14

标签: python pandas apache-spark pyspark apache-spark-sql

我正在尝试使用类似于

的数据框中的列进行直方图
DataFrame[C0: int, C1: int, ...]

如果我要用C1列进行直方图,我该怎么办?

我尝试过的一些事情是

df.groupBy("C1").count().histogram()
df.C1.countByValue()

由于数据类型不匹配而无法正常工作。

6 个答案:

答案 0 :(得分:12)

您可以使用histogram_numeric Hive UDAF:

import random

random.seed(323)

sqlContext = HiveContext(sc)
n = 3  # Number of buckets
df = sqlContext.createDataFrame(
    sc.parallelize(enumerate(random.random() for _ in range(1000))),
   ["id", "v"]
)

hists = df.selectExpr("histogram_numeric({0}, {1})".format("v", n))

hists.show(1, False)
## +------------------------------------------------------------------------------------+
## |histogram_numeric(v,3)                                                              |
## +------------------------------------------------------------------------------------+
## |[[0.2124888140177466,415.0], [0.5918851340384337,330.0], [0.8890271451209697,255.0]]|
## +------------------------------------------------------------------------------------+

您还可以提取感兴趣的列并在histogram上使用RDD方法:

df.select("v").rdd.flatMap(lambda x: x).histogram(n)
## ([0.002028109534323752,
##  0.33410233677189705,
##  0.6661765640094703,
##  0.9982507912470436],
## [327, 326, 347])

答案 1 :(得分:6)

对我有用的是

df.groupBy("C1").count().rdd.values().histogram()

我必须转换为RDD,因为我在pyspark.RDD类中找到了histogram方法,但在spark.SQL模块中找不到

答案 2 :(得分:6)

@Chris van den Berg提到的pyspark_dist_explore包非常好。如果您不想添加其他依赖项,可以使用这段代码绘制简单的直方图。

import matplotlib.pyplot as plt
# Show histogram of the 'C1' column
bins, counts = df.select('C1').rdd.flatMap(lambda x: x).histogram(20)

# This is a bit awkward but I believe this is the correct way to do it 
plt.hist(bins[:-1], bins=bins, weights=counts)

答案 3 :(得分:2)

假设您在C1中的值介于1-1000之间,您希望获得10个分箱的直方图。你可以这样做: df.withColumn(“bins”,df.C1 / 100).groupBy(“bins”)。count() 如果您的分箱更复杂,您可以为它制作UDF(更糟糕的是,您可能需要先分析该列,例如使用describe或其他方法)。

答案 4 :(得分:1)

如果您想绘制直方图,可以使用pyspark_dist_explore包:

fig, ax = plt.subplots()
hist(ax, df.groupBy("C1").count().select("count"))

如果您想要pandas DataFrame中的数据,可以使用:

pandas_df = pandas_histogram(df.groupBy("C1").count().select("count"))

答案 5 :(得分:-1)

一种简单的方法可能是

import pandas as pd
x = df.select('symboling').toPandas()  # symboling is the column for histogram
x.plot(kind='hist')