The behavior of the str.find()
method in polars differs from str.find()
in pandas in Python. Is there a parameter for processing utf-8 characters? Or is it a bug?
Example code in python:
import polars as pl
# Define a custom function that wraps the str.find() method
def find_substring(s, substring):
return int(s.find(substring))
# Test df
df = pl.DataFrame({
"text": ["testтестword",None,'']
})
# Apply the custom function to the "text" column using map_elements()
substr = 'word'
df = df.with_columns(
pl.col('text').str.find(substr,literal=True,strict=True).alias('in_polars'),
pl.col("text").map_elements(lambda s: find_substring(s, substr), return_dtype=pl.Int64).alias('find_check')
)
print(df)
Results:
There is no parameter in the documentation for setting the character encoding.
Using my function is a solution, but it's very slow.
Can you suggest something faster and without map_elements? Thanks.
pl.col("text").map_elements(lambda s: find_substring(s, substr), return_dtype=pl.Int64).alias('find_check')
There is an open issue on the Github tracker.
I think we should update the docs to make clear that we return byte offsets.
As for the actual goal - it seems you want split a string into 2 parts and take the right hand side.
You could use regex e.g. with .str.extract()
df.with_columns(after = pl.col("url").str.extract(r"\?(.*)"))
shape: (1, 2)
┌────────────────────────────────────┬──────────────┐
│ url ┆ after │
│ --- ┆ --- │
│ str ┆ str │
╞════════════════════════════════════╪══════════════╡
│ https://тестword.com/?foo=bar&id=1 ┆ foo=bar&id=1 │
└────────────────────────────────────┴──────────────┘
.str.splitn()
could be another option.
df = pl.DataFrame({
"url": ["https://тестword.com/?foo=bar&id=1"]
})
df.with_columns(
pl.col("url").str.splitn("?", 2)
.struct.rename_fields(["before", "after"])
.struct.unnest()
)
shape: (1, 3)
┌────────────────────────────────────┬───────────────────────┬──────────────┐
│ url ┆ before ┆ after │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞════════════════════════════════════╪═══════════════════════╪══════════════╡
│ https://тестword.com/?foo=bar&id=1 ┆ https://тестword.com/ ┆ foo=bar&id=1 │
└────────────────────────────────────┴───────────────────────┴──────────────┘
It returns a Struct which we rename/unnest into columns.