orient
选项:
返回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为生成器,而不是返回列表理解: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())
参考: