我正在尝试在生产代码中用Polars替换 Pandas ,以获得更好的内存性能。
Pandas 方法的 Polars 等效项是什么.isna()?我在文档中找不到任何好的等效内容。
这曾经是pandas这样处理的:
df.columns = df.columns.str.replace('.','_')
Run Code Online (Sandbox Code Playgroud)
这段代码可以工作,但绝对不是正确的解决方案。
renamed = {}
for column_name in list(filter(lambda x: '.' in x, df.columns)):
renamed[column_name] = column_name.replace('.', '_')
df = df.rename(renamed)
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在将 pandas 数据帧转换为 Polars 数据帧,但 pyarrow 抛出错误。
我的代码:
import polars as pl
import pandas as pd
if __name__ == "__main__":
with open(r"test.xlsx", "rb") as f:
excelfile = f.read()
excelfile = pd.ExcelFile(excelfile)
sheetnames = excelfile.sheet_names
df = pd.concat(
[
pd.read_excel(
excelfile, sheet_name=x, header=0)
for x in sheetnames
], axis=0)
df_pl = pl.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)
错误:
File "pyarrow\array.pxi", line 312, in pyarrow.lib.array
File "pyarrow\array.pxi", line 83, in pyarrow.lib._ndarray_to_array
File "pyarrow\error.pxi", line 122, in pyarrow.lib.check_status
pyarrow.lib.ArrowTypeError: Expected bytes, got a 'int' object
我尝试将 pandas dataframe …
在 PyCharm 中,您可以使用 SciView 工具显示 Pandas 数据框。Polars 也可以这样做吗?还是我必须发送垃圾邮件print邮件吗?
(我还开了一张 PyCharm 支持票)
所以我有一个像这样的 Polars 数据框
df = pl.DataFrame(
{
"ItemId": [15148, 15148, 24957],
"SuffixFactor": [19200, 200, 24],
"ItemRand": [254, -1, -44],
"Stat0": ['+5 Defense', '+$i Might', '+9 Vitality'],
"Amount": ['', '7', '']
}
)
Run Code Online (Sandbox Code Playgroud)
每当 Stat0 包含 i$ 时,我想用 Amount 替换“Stat0”列中的 $i
我尝试了几种不同的方法,例如:
df = df.with_column(
pl.col('Stat0').str.replace(r'\$i', pl.col('Amount'))
)
Run Code Online (Sandbox Code Playgroud)
预期结果
result = pl.DataFrame(
{
"ItemId": [15148, 15148, 24957],
"SuffixFactor": [19200, 200, 24],
"ItemRand": [254, -1, -44],
"Stat0": ['+5 Defense', '+7 Might', '+9 Vitality'],
"Amount": ['', '7', '']
}
)
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。
我希望有人能帮帮忙。
此致
我正在考虑在解析问题polars中使用 in 代替numpy,将结构化文本文件转换为字符表并在不同的列上进行操作。然而,这似乎比我执行的大多数操作polars慢大约 5 倍。numpy我想知道为什么会出现这种情况,以及考虑到应该polars更快,我是否做错了什么。
例子:
import requests
import numpy as np
import polars as pl
# Download the text file
text = requests.get("https://files.rcsb.org/download/3w32.pdb").text
# Turn it into a 2D array of characters
char_tab_np = np.array(file.splitlines()).view(dtype=(str,1)).reshape(-1, 80)
# Create a polars DataFrame from the numpy array
char_tab_pl = pl.DataFrame(char_tab_np)
# Sort by first column with numpy
char_tab_np[np.argsort(char_tab_np[:,0])]
# Sort by first column with polars
char_tab_pl.sort(by="column_0")
Run Code Online (Sandbox Code Playgroud)
使用%%timeitin 时Jupyter …
我一直在使用 Polars,但它似乎缺乏 pandas 那样的 qcut 功能。
我不确定原因,但是使用当前可用的 Polars 功能是否可以达到与 pandas qcut 相同的效果?
下面显示了一个关于我可以使用 pandas qcut 做什么的示例。
import pandas as pd
data = pd.Series([11, 1, 2, 2, 3, 4, 5, 1, 2, 3, 4, 5])
pd.qcut(data, [0, 0.2, 0.4, 0.6, 0.8, 1], labels=['q1', 'q2', 'q3', 'q4', 'q5'])
Run Code Online (Sandbox Code Playgroud)
结果如下:
0 q5
1 q1
2 q1
3 q1
4 q3
5 q4
6 q5
7 q1
8 q1
9 q3
10 q4
11 q5
dtype: category
Run Code Online (Sandbox Code Playgroud)
所以,我很好奇如何使用极坐标得到相同的结果?
感谢您的帮助。
我的 CSV 文件大小为 70 GB。我想在惰性模式下加载 DF 并计算行数。最好的方法是什么?
据我所知,根据文档,在惰性模式下没有像 shape 这样的函数。我发现这个答案提供了一个不基于 Polars 的解决方案,但我想知道是否也可以在 Polars 中做到这一点。
如何按特定顺序对行进行排序
df = pl.DataFrame({"currency": ["EUR","EUR","EUR","USD","USD","USD"], "alphabet": ["A","B","C","A","B","C"]})
Run Code Online (Sandbox Code Playgroud)
我需要按货币和自定义字母顺序降序
预计会是这样的
| 货币 | 字母 |
|---|---|
| 美元 | C |
| 美元 | A |
| 美元 | 乙 |
| 欧元 | C |
| 欧元 | A |
| 欧元 | 乙 |
我有一个适合 RAM 的数据集,但当我运行某些方法(例如df.unique(). 我的笔记本电脑有 16GB 内存。我正在使用 14GB RAM 运行 WSL。我使用的是 Polars 版本 0.18.4。运行df.estimated_size()表明,当我读入数据集时,我的数据集约为 6GB。我的数据的架构是
index: Int64
first_name: Utf8
last_name: Utf8
race: Utf8
pct_1: Float64
pct_2: Float64
pct_3: Float64
pct_4: Float64
Run Code Online (Sandbox Code Playgroud)
index: Int64
first_name: Utf8
last_name: Utf8
race: Utf8
pct_1: Float64
pct_2: Float64
pct_3: Float64
pct_4: Float64
Run Code Online (Sandbox Code Playgroud)
但是,我无法在不收到 SIGKILL 信号的情况下执行诸如.unique()、.drop_nulls()等任务。我正在使用 LazyFrames。
例如,
size = pl.read_parquet("data.parquet").estimated_size()
df = pl.scan_parquet("data.parquet") # use LazyFrames
Run Code Online (Sandbox Code Playgroud)
导致内存不足错误。我可以通过编写自定义函数来回避这个问题。
df = df.drop_nulls().collect(streaming=True)
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么后者有效而前者无效,因为数据集的最大版本(当我最初读入它时)适合 RAM。
不幸的是,我无法想出类似的技巧来做同样的事情.unique()。我可以做些什么来.unique()减少内存占用吗?我努力了:
def …Run Code Online (Sandbox Code Playgroud)