【问题标题】:Access dictionary value using Spark dataframe column as key使用 Spark 数据框列作为键访问字典值
【发布时间】:2021-12-12 22:28:28
【问题描述】:

我在下面有一本名为 sample 的字典。

sample = {
     10:1
     20:2
     30:3
}

例如,我有一个名为 age 的数据框列,该列包含 10。我想将此数据框列用作键查找,例如,如果键为 10,则为我提供值 1。

    df.withColumn("NewColumnname", dict.get(col("age")))

不可散列的类型:“列”

即将推出,但不确定以何种方式使用数据框中的列作为键查找。

【问题讨论】:

    标签: python dataframe apache-spark pyspark utf


    【解决方案1】:

    withColumn 的第二个参数是一个Column 对象,这就是你得到这个错误的原因。如果您只想进行查找,那么最好的方法是进行内部连接。我建议尽可能避免使用 UDF。

    将您的原始字典转换为“查找”数据框

    sample = {10:1, 20:2, 30:3}
    
    dict_df = spark.createDataFrame([(k, v) for k,v in sample.items()], schema = ['k', 'v'])
    
    # +---+---+
    # |  k|  v|
    # +---+---+
    # | 10|  1|
    # | 20|  2|
    # | 30|  3|
    # +---+---+
    

    这是示例数据框

    df = spark.sparkContext.parallelize([(10,), (20,), (30,)]).toDF(['col'])
    
    # +---+
    # |col|
    # +---+
    # | 10|
    # | 20|
    # | 30|
    # +---+
    

    执行内连接以获取查找值

    df.join(dict_df, on=[dict_df.k == df.col])
    
    # +---+---+---+
    # |col|  k|  v|
    # +---+---+---+
    # | 10| 10|  1|
    # | 30| 30|  3|
    # | 20| 20|  2|
    # +---+---+---+
    

    【讨论】:

    • 是否有不同的方法而不是创建一个新的df?
    • 1) 在执行 Spark 转换时,您不能按照您想要的方式引用字典,我目前想不出任何其他解决方案,以及 2) 为什么不呢?
    【解决方案2】:

    您试图在字典中查找整个列,但这不起作用,因为 a.列是不可散列的,并且 b.字典中永远不会有包含整个列的键。

    显然,您要做的是在字典的列中查找每个单独的值。有两种方法可以做到这一点,正确的一种取决于您要对数据执行的操作。要么将您的 dict 放入数据框并在 pandas 中执行,要么迭代列并查找。后者可能是你想要的,并且想要这样的东西:

    df["NewColumnname"] = df["age"].apply(lambda x: sample[x])
    

    编辑重新考虑 lambda 有点没用,而这 .get 的用例:

    df["new"] = df["age"].apply(sample.get)
    

    请注意,虽然 dicts 有一个 .get 方法,但如果您只是在查找一个您知道存在的值,则使用 [] 访问更符合 Pythonic。

    返回

    这会修改df,所以我们可以简单地添加:

    return df
    

    并从函数中获取 df。如果您需要处理副本,请先制作一个,然后以相同的方式添加列。

    演示

    import pandas as pd
    
    df = pd.DataFrame([[7],[8]], columns=["col"])
    d = {7: "seven", 8: "eight"}
    df["new"] = df["col"].apply(d.get)
    print(df)
    

    【讨论】:

    • 有没有办法可以使用 .withColumn(""NewColumnname", col("age").apply(lambda x: sample[x])) 我得到 > 'Column' 对象不是可调用,但如果可能的话想使用 withColumn。
    • 为什么要使用.withColumn?当你得到它时,你想对查找的值做什么?
    • 我想做如下的事情。我一直在尝试任何一种方式都无法调用“列”对象。我需要一个udf吗? return df.withColumn("NewColumnname", col("age").apply(lambda x: sample[x])).withColumn("DOB","DOB1").SELECT("NewColumnname","DOB")
    • 只返回df。您的问题似乎是 col("age") 而不是 col["age"]:注意方括号
    • df["new"] = df["age"].apply(sample.get) 返回 TypeError: 'Column' object is not callable
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2022-06-22
    • 2022-06-10
    • 2014-03-09
    相关资源
    最近更新 更多