如果一列的值包含在另一列中,我想加入两个数据格式。数据格式如下所示:
df1 = pl.DataFrame({"col1": [1, 2, 3], "col2": ["x1, x2, x3", "x2, x3", "x3"]})
df2 = pl.DataFrame({"col3": [4, 5, 6], "col4": ["x1", "x2", "x3"]})我试着做:
model_data = df1.join(df2, on="col2")这并不能产生预期的结果。我想看到的是这样的东西:
col1 col2 col3 col4
1 "x1, x2, x3" 4 "x1"
1 "x1, x2, x3" 5 "x2"
1 "x1, x2, x3" 6 "x3"
2 "x2, x3" 5 "x2"
2 "x2, x3" 6 "x3"
3 "x3" 6 "x3"这是一个问题,当一个值被另一个值包含时,如何进行连接。我在文档中找不到这方面的好例子。
发布于 2022-11-09 01:22:44
您希望将col2和.explode()拆分为类似于python-polars split string column into many columns by delimiter的
然后您可以执行.join()
>>> (df1.with_column(df1["col2"].str.split(", ").alias("col4"))
... .explode("col4")
... .join(df2, on="col4")
... .select(df1.columns + df2.columns))
shape: (6, 4)
┌──────┬────────────┬──────┬──────┐
│ col1 ┆ col2 ┆ col3 ┆ col4 │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ str │
╞══════╪════════════╪══════╪══════╡
│ 1 ┆ x1, x2, x3 ┆ 4 ┆ x1 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 1 ┆ x1, x2, x3 ┆ 5 ┆ x2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 1 ┆ x1, x2, x3 ┆ 6 ┆ x3 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2 ┆ x2, x3 ┆ 5 ┆ x2 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2 ┆ x2, x3 ┆ 6 ┆ x3 │
├╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 3 ┆ x3 ┆ 6 ┆ x3 │
└──────┴────────────┴──────┴──────┘发布于 2022-11-10 17:02:46
另一种与直觉相反更快的方法是在它们之间进行交叉连接,然后过滤掉col4不在col2中的时间。
看起来像这样..。
cj=df1.join(df2, how='cross')
filt=cj.apply(lambda x: x[3] in x[1])
cj.with_column(filt.to_series().alias('filt')).filter(pl.col('filt')==True).select(pl.exclude('filt'))本质上,所发生的事情是创建cj,它是一个df,它将每一行df1和df2混在一起。然后,您创建filt,这只是一系列的真理和谎言,您可以过滤。按此进行筛选,然后执行选择以排除该助手列。您只需小心第二行lambda表达式中的索引位置。
您必须测试这个vs @jq散利方法的性能。如果(大if,我不知道)这个更快,那是因为str.split.explode没有像把所有东西混在一起那样高效。不幸的是,series.str.contains方法正在寻找固定的正则表达式或文本,这就是为什么使用lambda的原因。
https://stackoverflow.com/questions/74352280
复制相似问题