#python #python-polars
#python #python-polars
Вопрос:
Я пытаюсь объединить два фрейма данных с помощью категориальных функций и ленивого API. Я попытался сделать это так, как это было описано в руководстве пользователя (https://pola-rs.github.io/polars-book/user-guide/performance/strings.html )
count = admin_df.groupby(['admin','EVENT_DATE']).pivot(pivot_column='FIVE_TYPE',values_column='count').first().lazy()
fatalities = admin_df.groupby(['admin','EVENT_DATE']).pivot(pivot_column='FIVE_TYPE',values_column='FATALITIES').first().lazy()
fatalities = fatalities.with_column(pl.col("admin").cast(pl.Categorical))
count = count.with_column(pl.col("admin").cast(pl.Categorical))
admin_df = fatalities.join(count,on=['admin','EVENT_DATE']).collect()
но я получаю следующую ошибку:
Traceback (most recent call last):
File "country_level.py", line 33, in <module>
country_level('/c/Users/Sebastian/feast/fluent_sunfish/data/ACLED_geocoded.parquet')
File "country_level.py", line 10, in country_level
country_df=aggregate_by_date(df)
File "country_level.py", line 29, in aggregate_by_date
admin_df = fatalities.join(count,on=['admin','EVENT_DATE']).collect()
File "/home/sebastian/.local/lib/python3.8/site-packages/polars/internals/lazy_frame.py", line 293, in collect
return pli.wrap_df(ldf.collect())
RuntimeError: Any(ValueError("joins on categorical dtypes can only happen if they are created under the same global string cache"))
при использовании with pl.StringCache():
все работает нормально, хотя в руководстве пользователя говорится, что это не требуется, если вы используете lazy API, я что-то упускаю или это ошибка?
Комментарии:
1. Я смог воспроизвести это, используя приведенный вами пример кода (включая a
.collect()
, которого нет в примере, но он необходим для запуска ошибки), и определенно кажется ошибкой. Я отправил отчет по адресу github.com/pola-rs/polars/issues/1993 Я бы предложил использоватьwith pl.StringCache()
его на данный момент.
Ответ №1:
Руководство пользователя неверно. Вам необходимо установить глобальный строковый кэш.
Вы можете установить глобальный строковый кэш с pl.StringCache():
помощью или с pl.Config.set_global_string_cache
помощью .
import polars as pl
pl.Config.set_global_string_cache()
lf1 = pl.DataFrame({
"a": ["foo", "bar", "ham"],
"b": [1, 2, 3]
}).lazy()
lf2 = pl.DataFrame({
"a": ["foo", "spam", "eggs"],
"c": [3, 2, 2]
}).lazy()
lf1 = lf1.with_column(pl.col("a").cast(pl.Categorical))
lf2 = lf2.with_column(pl.col("a").cast(pl.Categorical))
lf1.join(df2, on="a", how="inner").collect()
Выводит:
shape: (1, 3)
┌───────┬─────┬─────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ cat ┆ i64 ┆ i64 │
╞═══════╪═════╪═════╡
│ "foo" ┆ 1 ┆ 3 │
└───────┴─────┴─────┘