首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在其他列中有列值,则极性将连接两个数据帧。

如果在其他列中有列值,则极性将连接两个数据帧。
EN

Stack Overflow用户
提问于 2022-11-07 20:00:52
回答 2查看 88关注 0票数 0

如果一列的值包含在另一列中,我想加入两个数据格式。数据格式如下所示:

代码语言:javascript
复制
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"]})

我试着做:

代码语言:javascript
复制
model_data = df1.join(df2, on="col2")

这并不能产生预期的结果。我想看到的是这样的东西:

代码语言:javascript
复制
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"

这是一个问题,当一个值被另一个值包含时,如何进行连接。我在文档中找不到这方面的好例子。

EN

回答 2

Stack Overflow用户

发布于 2022-11-09 01:22:44

您希望将col2.explode()拆分为类似于python-polars split string column into many columns by delimiter

然后您可以执行.join()

代码语言:javascript
复制
>>> (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   │
└──────┴────────────┴──────┴──────┘
票数 2
EN

Stack Overflow用户

发布于 2022-11-10 17:02:46

另一种与直觉相反更快的方法是在它们之间进行交叉连接,然后过滤掉col4不在col2中的时间。

看起来像这样..。

代码语言:javascript
复制
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的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74352280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档