小编Dah*_*ahn的帖子

Pandas ExtensionArray 的简单示例

在我看来,PandasExtensionArray将是一个简单的入门示例真正有帮助的情况之一。但是,我还没有在任何地方找到足够简单的示例。

创建一个 ExtensionArray

要创建ExtensionArray,您需要

Pandas 文档中还有一个部分提供了简要概述。

示例实现

有很多实现的例子:

尽管研究了以上所有内容,我仍然发现扩展数组难以理解。所有示例都有很多细节和自定义功能,这使得很难确定实际需要什么。我怀疑很多人都遇到过类似的问题。

因此,我要求提供一个简单最小的工作ExtensionArray.

举一个具体的例子,假设我想扩展ExtensionArray以获得一个能够保存 NA 值的整数数组。这本质上是IntegerArray,但剥离了超出ExtensionArray.

python dataframe pandas

8
推荐指数
1
解决办法
262
查看次数

如何使用 pyarrow 存储自定义 Parquet 数据集元数据?

如何使用ParquetDatasetpyarrow 将自定义元数据存储?

例如,如果我使用 Dask 创建 Parquet 数据集

import dask
dask.datasets.timeseries().to_parquet('temp.parq')
Run Code Online (Sandbox Code Playgroud)

然后我可以使用 pyarrow 阅读它

import pyarrow.parquet as pq
dataset = pq.ParquetDataset('temp.parq')
Run Code Online (Sandbox Code Playgroud)

但是,我用于为单个 parquet 文件编写元数据的相同方法(在如何使用 pyarrow 编写 Parquet 元数据?中概述)不适用于 a ParquetDataset,因为没有replace_schema_metadata函数或类似的函数。

我想我可能想编写一个自定义_custom_metadata文件,因为我想存储的元数据与整个数据集有关。我想这个过程会类似于:

meta = pq.read_metadata('temp.parq/_common_metadata')
custom_metadata = { b'type': b'mydataset' }
merged_metadata = { **custom_metadata, **meta.metadata }
# TODO: Construct FileMetaData object with merged_metadata
new_meta.write_metadata_file('temp.parq/_common_metadata')
Run Code Online (Sandbox Code Playgroud)

python parquet pyarrow

7
推荐指数
1
解决办法
1198
查看次数

“合并”多个列

如果我有一个简单的查询

SELECT row FROM table WHERE id=my_id

如果my_id找不到,我想要一行带有 NULL 而不是空行,我可以使用coalesce

COALESCE( (SELECT row FROM table WHERE id=my_id), NULL)
Run Code Online (Sandbox Code Playgroud)

如果我的查询返回多列并且我想要一行 NULL,我该怎么办?

SELECT row1,row2,row3 FROM table WHERE id=my_id
Run Code Online (Sandbox Code Playgroud)

sql postgresql

6
推荐指数
1
解决办法
1万
查看次数

Dask dataframe:“set_index”可以将单个索引放入多个分区吗?

根据经验,每当您set_index使用 Dask 数据帧时,Dask 总是会将具有相同索引的行放入单个分区中,即使这会导致分区严重不平衡。

这是一个演示:

import pandas as pd
import dask.dataframe as dd

users = [1]*1000 + [2]*1000 + [3]*1000

df = pd.DataFrame({'user': users})
ddf = dd.from_pandas(df, npartitions=1000)

ddf = ddf.set_index('user')

counts = ddf.map_partitions(lambda x: len(x)).compute()
counts.loc[counts > 0]
# 500    1000
# 999    2000
# dtype: int64
Run Code Online (Sandbox Code Playgroud)

然而,我在任何地方都找不到这种行为的保证。

我曾尝试自己筛选代码,但放弃了。我相信这些相互关联的函数之一可能包含答案:

当您时set_index,单个索引是否永远不能位于两个不同的分区中?如果不是,那么该财产在什么条件下成立?


赏金:我将向来自信誉良好的来源的答案授予赏金。例如,引用实现来表明该属性必须成立。

python indexing dataframe dask

6
推荐指数
1
解决办法
1612
查看次数

抑制 pandas 中 to_markdown() 中的科学记数法

一般来说,关于抑制 Pandas 中的科学记数法存在许多问题

然而,它们似乎都不适用于该to_markdown功能。例如:

import pandas as pd

df = pd.DataFrame({'val': 3e10}, index=[0])  # print(df) gives 3.000000e+10
pd.set_option('float_format', '{:f}'.format) # print(df) gives 30000000000.000000
Run Code Online (Sandbox Code Playgroud)

然而,df.to_markdown()仍然有产出

|    |   val |
|---:|------:|
|  0 | 3e+10 |
Run Code Online (Sandbox Code Playgroud)

如何禁用 中的科学记数法to_markdown()

python dataframe pandas

4
推荐指数
1
解决办法
1733
查看次数

通过文件目标完美缓存

在阅读了有关基于文件目标的输出缓存的 文档后,我认为此工作流程应该是输出缓存的示例:

from time import sleep
from prefect import Flow, task
from prefect.engine.results import LocalResult


@task(target="func_task_target.txt", checkpoint=True, 
      result=LocalResult(dir="~/.prefect"))
def func_task():
    sleep(5)
    return 99

with Flow("Test-cache") as flow:
    func_task()

if __name__ == '__main__':
    flow.run()
Run Code Online (Sandbox Code Playgroud)

我希望func_task运行一次,进行缓存,然后在下次运行流程时使用缓存的值。然而,似乎func_task每次都会运行。

我哪里出错了?或者我误解了文档?

python prefect

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

标签 统计

python ×5

dataframe ×3

pandas ×2

dask ×1

indexing ×1

parquet ×1

postgresql ×1

prefect ×1

pyarrow ×1

sql ×1