文字列として州のイニシャルの束で満たされた列があります。私の目標は、そのようなリストの各州の数をどのようにするかです。
例:(("TX":3),("NJ":2))
は、"TX"
と"NJ"
が2回出現した場合の出力です。
私はpysparkにかなり慣れていないので、この問題に困惑しています。どんな助けでも大歓迎です。
groupBy と count のDataFrameイディオムを使用しようとしていると思います。
たとえば、次のデータフレームでは、行ごとに1つの状態があります。
df = sqlContext.createDataFrame([('TX',), ('NJ',), ('TX',), ('CA',), ('NJ',)], ('state',))
df.show()
+-----+
|state|
+-----+
| TX|
| NJ|
| TX|
| CA|
| NJ|
+-----+
次の利回り:
df.groupBy('state').count().show()
+-----+-----+
|state|count|
+-----+-----+
| TX| 2|
| NJ| 2|
| CA| 1|
+-----+-----+
import pandas as pd
import pyspark.sql.functions as F
def value_counts(spark_df, colm, order=1, n=10):
"""
Count top n values in the given column and show in the given order
Parameters
----------
spark_df : pyspark.sql.dataframe.DataFrame
Data
colm : string
Name of the column to count values in
order : int, default=1
1: sort the column descending by value counts and keep nulls at top
2: sort the column ascending by values
3: sort the column descending by values
4: do 2 and 3 (combine top n and bottom n after sorting the column by values ascending)
n : int, default=10
Number of top values to display
Returns
----------
Value counts in pandas dataframe
"""
if order==1 :
return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc_nulls_first("count")).head(n),columns=["value","count"])
if order==2 :
return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.asc(colm)).head(n),columns=["value","count"])
if order==3 :
return pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc(colm)).head(n),columns=["value","count"])
if order==4 :
return pd.concat([pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.asc(colm)).head(n),columns=["value","count"]),
pd.DataFrame(spark_df.select(colm).groupBy(colm).count().orderBy(F.desc(colm)).head(n),columns=["value","count"])])