【问题标题】:Count items separated by commas from a list从列表中计算以逗号分隔的项目
【发布时间】:2021-10-15 03:04:49
【问题描述】:

我有一个如下所示的 pyspark 数据框:

df = spark.sql("""

SELECT list

FROM categories

""")

df.show()
list
1,1,1,2,2,apple
apple,orange,1,2

如何生成一个字段来计算以逗号分隔的元素?理想的数据框如下所示:

list count
1,1,1,2,2,apple 6
apple,orange,1,2 4

我也想创建这样的外观:

list frequency_count
1 4
2 3
apple 2
orange 1

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: python dataframe pyspark


【解决方案1】:

对我来说,用dataframe写比较费劲,SQL实现如下。

count_df = df.withColumn('count', F.size(F.split('list', ',')))
count_df.show(truncate=False)

df.createOrReplaceTempView('tmp')
freq_sql = """
    select list,count(*) count from
        (select explode(flatten(collect_list(split(list, ',')))) list
        from tmp)
    group by list
"""
freq_df = spark.sql(freq_sql)
freq_df.show(truncate=False)

【讨论】:

    【解决方案2】:

    您实际上有两个问题。要获取“,”分隔符字符串的项目数,您可以这样做:

    import pandas as pd
    df = pd.DataFrame(data=["1,1,1,2,2,apple", "apple,orange,1,2"], columns=["list"])
    df["count"] = df["list"].apply(lambda x: len(x.split(",")))
    print(df)
    

    作为输出:

                      list  count
    0      1,1,1,2,2,apple      6
    1     apple,orange,1,2      4
    

    我在这里使用了一个 lambda 函数,它对每个项目执行 split 操作(返回字符串中单独项目的列表),然后用 len()计算项目>。您可以使用 apply 方法将 lambda 函数应用于列中的每个项目。

    在第二个问题中,您要计算数据框中每个项目的唯一元素。您可以先使用 split 方法将字符串项拆分为单独的列:

    df_items = df["list"].str.split(",", expand=True)
    print(df_items)
    

    这会给你一个这样的数据框:

           0       1  2  3     4      5
    0      1       1  1  2     2  apple
    1  apple  orange  1  2  None   None
    

    然后,由于每个唯一项目的位置无关紧要,您可以使用 melt 方法将所有列粘合到一个列中。 melt 方法将所有项目放在一个名为 value 的列中。您可以使用 value_count 获取列的项目数。脚本如下所示:

    frequency_count = pd.melt(df_items)['value'].value_counts()
    frequency_count.index.name = "list"
    frequency_count = pd.DataFrame(frequency_count).rename(columns={"value":  "frequency_count"})
    

    给你输出

            frequency_count
    list                   
    1                     4
    2                     3
    apple                 2
    orange                1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2021-09-04
      • 1970-01-01
      相关资源
      最近更新 更多