我有两个数据框,
df = pl.DataFrame({'url': ['https//abc.com', 'https//abcd.com', 'https//abcd.com/aaa', 'https//abc.com/abcd']})
conditions_df = pl.DataFrame({'url': ['https//abc.com', 'https//abcd.com', 'https//abcd.com/aaa', 'https//abc.com/aaa'], 'category': [['a'], ['b'], ['c'], ['d']]})
现在我想要一个 df,用于根据第二个 df 中以 url 开头的第一个匹配项为第一个 df 分配类别,即输出应该是,
网址 | 类别 |
---|---|
https//abc.com | ['一个'] |
https//abcd.com | ['b'] |
https//abcd.com/aaa | ['b'] - 这个以 https//abcd.com 开头,这是第一个匹配 |
https//abc.com/abcd | ['a'] - 这个以 https//abc.com 开头,这是第一个匹配 |
目前有效的代码是这样的,
def add_category_column(df: pl.DataFrame, conditions_df) -> pl.DataFrame:
# Initialize the category column with empty lists
df = df.with_columns(pl.Series("category", [[] for _ in range(len(df))], dtype=pl.List(pl.String)))
# Apply the conditions to populate the category column
for row in conditions_df.iter_rows():
url_start, category = row
df = df.with_columns(
pl.when(
(pl.col("url").str.starts_with(url_start)) & (pl.col("category").list.len() == 0)
)
.then(pl.lit(category))
.otherwise(pl.col("category"))
.alias("category")
)
return df
但是有没有办法在不使用 for 循环的情况下实现相同的效果,我们可以在这里使用 join_where 吗,但在我的尝试中 join_where 对 starts_with 不起作用