例如,我有一个极坐标数据框:
\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\nRun Code Online (Sandbox Code Playgroud)\n我正在尝试获取第三列,C即True列中的字符串是否以同一行的B列中的字符串开头,否则。所以在上面的例子中,我期望:AFalse
\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) 我有一个极地数据框:
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) 知道我可以做什么来使用极坐标来模仿下面的 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 万行,所以我正在寻找尽可能快的东西。
我想根据条件选择 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。我究竟做错了什么?
假设我想制作一个函数列表,即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 作为参数,这就像我的备份计划,所以我希望得到类似于上面的东西。
如果我有一个极坐标数据框并想要执行屏蔽操作,我目前看到两个选项:
\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)\nRun Code Online (Sandbox Code Playgroud)\nmasked_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())\nRun Code Online (Sandbox Code Playgroud)\n我正在尝试将相当混乱的 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 数据帧并开始清理数据。
我有一个带有 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)
它很慢。如何改进呢?
我有一个极坐标数据框,例如:
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)
谢谢。
我正在尝试将utf-8DataFrame 中的列转换为YYYY-MM-DD. 如何将不同的日期格式转换为一种格式YYYY-MM-DD?
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\nRun Code Online (Sandbox Code Playgroud)\n python ×10
python-polars ×10
dataframe ×3
data-science ×1
date-format ×1
floor ×1
querying ×1
timestamp ×1