我已经阅读了镶木地板文件,我想过滤 使用准备好的词典的行。数据框中有两列名为col1和col2,它们是string类型。我的字典中有一组字符串,我想要一些行,其中列col1和col2中字符串的串联在字典中。我试过了
df.filter((df['col1']+df['col2']) in my_dict)
但似乎df['col1']+df['col2']
不是字符串,即使这是列的类型。
我也试过
df.filter(lambda x: (x['col1']+df['col2']) in my_dict)
正确的方法是什么?
答案 0 :(得分:3)
因此,您的问题中有两个组成部分:
关于第一部分 - 这是使用玩具数据帧的字符串列连接的示例:
spark.version
# u'2.1.1'
from pyspark.sql.functions import concat, col, lit
df = spark.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.show()
# +---+---+
# | k| v|
# +---+---+
# |foo| 1|
# |bar| 2|
# +---+---+
df2 = df.select(concat(col("k"), lit(" "), col("v")).alias('joined_colname'))
df2.show()
# +--------------+
# |joined_colname|
# +--------------+
# | foo 1|
# | bar 2|
# +--------------+
关于第二部分,您需要.isin
方法 - 不确定它是否适用于词典,但它肯定适用于列表(['foo 1', 'foo 2']
)或集合({'foo 1', 'foo 2'}
):< / p>
df2.filter(col('joined_colname').isin({'foo 1', 'foo 2'})).show() # works with lists, too
# +--------------+
# |joined_colname|
# +--------------+
# | foo 1|
# +--------------+
希望这足够有用......
编辑(评论后):将已加入的列与初始df
的列保持在一起:
df3 = df.withColumn('joined_colname', concat(col("k"), lit(" "), col("v")))
df3.show()
# +---+---+--------------+
# | k| v|joined_colname|
# +---+---+--------------+
# |foo| 1| foo 1|
# |bar| 2| bar 2|
# +---+---+--------------+