返回生成器,而不是df.to_dict()

问题描述 投票:0回答:2
可以通过调用

.to_dict(orient='records')

方法来生成所需的词典。如文档中所述,返回的值取决于

orient选项:


返回:dict,list或collections.abc.mapping
返回a collections.abc.映射对象表示数据框架。这
结果转换取决于东方参数。

对于我的案件,通过了
orient='records'

,返回了词典列表。处理列表时,保留/分配了存储列表项所需的完整内存。由于我的数据框可能会变得很大,因此这可能会导致内存问题,尤其是在较低的规格目标系统上执行代码。

i当然可以通过处理数据框块并生成每个块的字典列表来避免此问题,然后将其传递给API。此外,调用

iter(df.to_dict(orient='records'))

将返回所需的生成器,但不会在列表中创建列表时减少所需的内存足迹。
有一种方法可以直接从

df.to_dict(orient='records')

而不是列表返回生成器表达式以减少内存足迹?

没有一种直接从

to_dict(orient='records')

获取发电机的方法。但是,可以修改

to_dict
sourcecode

为生成器,而不是返回列表理解:
python pandas dataframe dictionary generator
2个回答
4
投票
from pandas.core.common import standardize_mapping from pandas.core.dtypes.cast import maybe_box_native def dataframe_records_gen(df_): columns = df_.columns.tolist() into_c = standardize_mapping(dict) for row in df_.itertuples(index=False, name=None): yield into_c( (k, maybe_box_native(v)) for k, v in dict(zip(columns, row)).items() )

样本代码:
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
})

# Using Generator
for row in dataframe_records_gen(df):
    print(row)

# For Comparison with to_dict function
print("to_dict", df.to_dict(orient='records'))
输出:

{'A': 1, 'B': 3} {'A': 2, 'B': 4} to_dict [{'A': 1, 'B': 3}, {'A': 2, 'B': 4}]

对于更自然的语法,也可以注册自定义登录器:

import pandas as pd
from pandas.core.common import standardize_mapping
from pandas.core.dtypes.cast import maybe_box_native


@pd.api.extensions.register_dataframe_accessor("gen")
class GenAccessor:
    def __init__(self, pandas_obj):
        self._obj = pandas_obj

    def records(self):
        columns = self._obj.columns.tolist()
        into_c = standardize_mapping(dict)

        for row in self._obj.itertuples(index=False, name=None):
            yield into_c(
                (k, maybe_box_native(v))
                for k, v in dict(zip(columns, row)).items()
            )

在这种情况下,这使该发电机可以通过

gen
登录器访问:

df = pd.DataFrame({ 'A': [1, 2], 'B': [3, 4] }) # Using Generator through registered custom accessor for row in df.gen.records(): print(row) # For Comparison with to_dict function print("to_dict", df.to_dict(orient='records'))

输出:

{'A': 1, 'B': 3} {'A': 2, 'B': 4} to_dict [{'A': 1, 'B': 3}, {'A': 2, 'B': 4}]
    

pandas dataFrames具有
itertuples

方法,该方法返回一个命名元组的生成器。 命名的元组具有
_asdict()
方法。 因此,您可以将行的发电机作为字典,其中包括:

row_generator = (row._asdict() for row in df.itertuples())
参考:

0
投票

df.itertuples
https://pandas.pydata.org/docs/reference/api/pandas.dataframe.itertuples.html#pandas.dataframe.itertuples

namedtuple._asdict()

Https://docs.python.org/3/library/collections.html#collections.somenamedtuple._asdict
  •     
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.