标签: python-polars

使用另一列中的值对 str.starts_with() 进行极坐标分析

例如,我有一个极坐标数据框:

\n
>>> df = pl.DataFrame({\'A\': [\'a\', \'b\', \'c\', \'d\'], \'B\': [\'app\', \'nop\', \'cap\', \'tab\']})\n>>> df\nshape: (4, 2)\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 A   \xe2\x94\x86 B   \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 --- \xe2\x94\x82\n\xe2\x94\x82 str \xe2\x94\x86 str \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 a   \xe2\x94\x86 app \xe2\x94\x82\n\xe2\x94\x82 b   \xe2\x94\x86 nop \xe2\x94\x82\n\xe2\x94\x82 c   \xe2\x94\x86 cap \xe2\x94\x82\n\xe2\x94\x82 d   \xe2\x94\x86 tab \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

我正在尝试获取第三列,CTrue列中的字符串是否以同一行的B列中的字符串开头,否则。所以在上面的例子中,我期望:AFalse

\n
\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 A   \xe2\x94\x86 B   \xe2\x94\x86 C     \xe2\x94\x82\n\xe2\x94\x82 --- \xe2\x94\x86 --- \xe2\x94\x86 ---   \xe2\x94\x82\n\xe2\x94\x82 str \xe2\x94\x86 str \xe2\x94\x86 bool  \xe2\x94\x82\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xaa\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\xe2\x94\x82 a   \xe2\x94\x86 app \xe2\x94\x86 …
Run Code Online (Sandbox Code Playgroud)

python python-polars

2
推荐指数
1
解决办法
1590
查看次数

Polars 使用字符串格式创建列

我有一个极地数据框:

df = pl.DataFrame({'schema_name': ['test_schema', 'test_schema_2'], 
                       'table_name': ['test_table', 'test_table_2'],
                       'column_name': ['test_column, test_column_2','test_column']})
Run Code Online (Sandbox Code Playgroud)
架构名称 表名 列名
测试模式 测试表 测试列、测试列2
测试模式_2 测试表_2 测试列

我有一个字符串:

date_field_value_max_query = '''
    select '{0}' as schema_name, 
           '{1}' as table_name, 
           greatest({2})
    from {0}.{1}
    group by 1, 2
'''
Run Code Online (Sandbox Code Playgroud)

我想使用极坐标通过字符串格式添加列。目标数据框是这样的:

架构名称 表名 列名 询问
测试模式 测试表 测试列、测试列2 从 test_schema.test_table 组中选择 test_schema、test_table、maximum(test_column、test_column_2) by 1, 2
测试模式_2 测试表_2 测试列 从 test_schema_2.test_table_2 分组中选择 test_schema_2、test_table_2、maximum(test_column) by 1, 2

在 pandas 中,我会做这样的事情:

df.apply(lambda row: date_field_value_max_query.format(row['schema_name'], row['table_name'], row['column_name']), axis=1)
Run Code Online (Sandbox Code Playgroud)

对于极地,我尝试了以下方法:

df.with_column(
    (date_field_value_max_query.format(pl.col('schema_name'), pl.col('table_name'), pl.col('column_name')))
) …
Run Code Online (Sandbox Code Playgroud)

python python-polars

2
推荐指数
1
解决办法
1274
查看次数

如何在Polars中模仿Pandas基于索引的查询?

知道我可以做什么来使用极坐标来模仿下面的 pandas 代码吗?Polars 没有像 pandas 这样的索引,所以我不知道我能做什么。

df = pd.DataFrame(data = ([21,123], [132,412], [23, 43]), columns = ['c1', 'c2']).set_index("c1")
print(df.loc[[23, 132]])
Run Code Online (Sandbox Code Playgroud)

它打印

c1 c2
23 43
132 第412章

我唯一能想到的极坐标转换是

df = pl.DataFrame(data = ([21,123], [132,412], [23, 43]), schema = ['c1', 'c2'])
print(df.filter(pl.col("c1").is_in([23, 132])))
Run Code Online (Sandbox Code Playgroud)

但它打印

c1 c2
132 第412章
23 43

这没关系,但行不符合我给出的顺序。我给出了 [23, 132] 并希望输出行的顺序相同,就像 pandas 的输出一样。

是的,我可以稍后使用 sort() ,但是我使用它的原始数据有大约 3000 万行,所以我正在寻找尽可能快的东西。

python querying data-science python-polars

2
推荐指数
1
解决办法
109
查看次数

根据 Polars 中的条件选择列

我想根据条件选择 Polars DataFrame 中的列。就我而言,我想选择唯一值少于 100 个的所有字符串列。我天真地尝试过:

df.select((pl.col(pl.Utf8)) & (pl.all().n_unique() < 100))
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,这可能是由于表达式的第二部分造成的。

df.select(pl.all().n_unique() < 100)
Run Code Online (Sandbox Code Playgroud)

这不会选择列,而是返回布尔值的单行 DataFrame。我想,我是极坐标新手,但仍然不能完全理解表达式 API。我究竟做错了什么?

python dataframe python-polars

2
推荐指数
1
解决办法
4944
查看次数

对表达式函数使用列表理解

假设我想制作一个函数列表,即aggs=['sum','std','mean','min','max']

那么如果我有一个任意的 df

df=pl.DataFrame({'a':[1,2,3], 'b':[2,3,4]})
Run Code Online (Sandbox Code Playgroud)

我希望能够做类似的事情(这显然行不通)

df.with_columns([pl.col('a').x() for x in aggs])
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点? aggs不需要是字符串列表,而只是为了这个问题的目的而键入我的意图的最简单方法。此外,它还需要有空间.suffix()

我知道我可以有一个函数,该函数包含函数中的所有 aggs 并接受任意 dfs 作为参数,这就像我的备份计划,所以我希望得到类似于上面的东西。

python list-comprehension python-polars

2
推荐指数
1
解决办法
227
查看次数

屏蔽 Polars 数据帧以进行复杂操作

如果我有一个极坐标数据框并想要执行屏蔽操作,我目前看到两个选项:

\n
# create data\ndf = pl.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], schema = [\'a\', \'b\']).lazy()\n# create a second dataframe for added fun\ndf2 = pl.DataFrame([[8, 6, 7, 5], [15, 16, 17, 18]], schema=["b", "d"]).lazy()\n\n# define mask\nmask = pl.col(\'a\').is_between(2, 3)\n
Run Code Online (Sandbox Code Playgroud)\n

选项 1:创建过滤后的数据帧,执行操作并连接回原始数据帧

\n
masked_df = df.filter(mask)\nmasked_df = masked_df.with_columns(  # calculate some columns\n    [\n        pl.col("a").sin().alias("new_1"),\n        pl.col("a").cos().alias("new_2"),\n        (pl.col("a") / pl.col("b")).alias("new_3"),\n    ]\n).join(  # throw a join into the mix\n    df2, on="b", how="left"\n)\nres = df.join(masked_df, how="left", on=["a", "b"])\nprint(res.collect())\n
Run Code Online (Sandbox Code Playgroud)\n

选项 2:单独屏蔽每个操作

\n …

python dataframe python-polars

2
推荐指数
1
解决办法
707
查看次数

Polars read_excel 的日期格式问题

我正在尝试将相当混乱的 Excel 文件读取到 Polars 数据帧,但收到“XlsxValueError:错误:潜在无效的日期格式。”。

我认为该问题与某些采用 Excel 数字日期格式的日期列值有关,从而引发错误。有没有办法让我对 Polars 或 Xlsx2csv 选项进行设置,我希望将列读取为字符串类型,而不是尝试转换为日期。我尝试将 infer_schema_length 设置为 0 以将列读取为字符串,但看起来它已经是 xlsx2csv writer 引发了错误。

我的代码目前如下:

pl.read_excel(file="file_path",
         sheet_name="sheet_name",
        read_csv_options={"infer_schema_length":0},
         xlsx2csv_options={"skip_hidden_rows":False})
Run Code Online (Sandbox Code Playgroud)

出去:

XlsxValueError: Error: potential invalid date format.
Run Code Online (Sandbox Code Playgroud)

当使用 Pandas read_excel 读取数据时,它不会引发错误。当尝试将 Pandas df 转换为极坐标时,会引发错误:

df = pd.read_excel("file_name",
         sheet_name="sheet_name")
pl.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)

出去:

ArrowTypeError: Expected bytes, got a 'int' object
Run Code Online (Sandbox Code Playgroud)

我当前的解决方法(不理想)是使用 Pandas 以字符串格式读取数据,然后转换为 Polars 数据帧并开始清理数据。

python python-polars

2
推荐指数
1
解决办法
1969
查看次数

极地日期时间 5 分钟楼层

我有一个带有 datetime[ns] 类型的时间戳列的极坐标数据帧,其值为2023-03-08 11:13:07.831 我想使用极坐标效率将时间戳四舍五入到 5 分钟下限。

现在我这样做:

import arrow

def timestamp_5minutes_floor(ts: int) -> int:
    return int(arrow.get(ts).timestamp() // 300000 * 300000)

df.with_columns([
    pl.col("timestamp").apply(lambda x: timestamp_5minutes_floor(x)).alias("ts_floor")
    ])
Run Code Online (Sandbox Code Playgroud)

它很慢。如何改进呢?

python timestamp floor python-polars

2
推荐指数
1
解决办法
892
查看次数

如何将 Polars 数据帧列类型从 float64 转换为 int64?

我有一个极坐标数据框,例如:

import polars as pl
df = pl.DataFrame({"foo": [1.0, 2.0, 3.0], "bar": [11, 5, 8]})
Run Code Online (Sandbox Code Playgroud)

如何将第一列转换为 int64 类型?
我正在尝试类似的事情:

df.select(pl.col('foo')) = df.select(pl.col('foo')).cast(pl.Int64)
Run Code Online (Sandbox Code Playgroud)

但它不起作用。
在 Pandas 中这非常简单:

df['foo'] = df['foo'].astype('int64')
Run Code Online (Sandbox Code Playgroud)

谢谢。

python dataframe python-polars

2
推荐指数
1
解决办法
2481
查看次数

Polars Dataframe:Utf8列的日期转换

我正在尝试将utf-8DataFrame 中的列转换为YYYY-MM-DD. 如何将不同的日期格式转换为一种格式YYYY-MM-DD

\n
s = pl.Series("date",\\["Sun Jul  8 00:34:60 2001", "12Mar2022", "12/Mar/2022"\\])\n\ndf=s.to_frame().with_columns(pl.col("date").str.strptime(pl.Date,fmt=('%d%m%Y' ), strict=False)) \n\nprint(df)\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\n\xe2\x94\x82 date \xe2\x94\x82\n\n\xe2\x94\x82 ---  \xe2\x94\x82\n\n\xe2\x94\x82 date \xe2\x94\x82\n\n\xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1\n\n\xe2\x94\x82 null \xe2\x94\x82\n\n\xe2\x94\x82 null \xe2\x94\x82\n\n\xe2\x94\x82 null \xe2\x94\x82\n\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

python date-format date-conversion python-polars

2
推荐指数
1
解决办法
615
查看次数