首页 > 解决方案 > 如何操作通过 itertuples 生成的命名元组专门删除一个元素并从剩余元素中生成一个字典?

问题描述

最好用一个例子来扩展这个问题:

import pandas as pd
import numpy as np

np.random.seed(1)
df = pd.DataFrame(np.random.randn(1000,4),columns=list('ABCD'))

def func(A,B,C):
    
    return A + B + C

for index,kwargs in df.iterrows():
    
    kwargs.pop('D')
    result = func(**kwargs)

这里的具体目标是复制上面的示例,但为了提高效率,部署 itertuples 而不是 iterrows。但是,当切换到 itertuples 时,我不确定如何操作 pandas.core.frame.Pandas 对象,即以类似方式为每一行生成的 pandas 命名元组,以实现与操作 pandas 相同的目标。 iterrows 函数生成的 core.series.Series 对象。

这是想法:

for kwargs in df.itertuples():
    
    kwargs.pop('D')
    result = func(**kwargs)

当然,for 循环中的任何一行都不起作用,因为新的迭代方法产生了不同的对象。如何直接重写(我还没有找到等效的方法)或间接地实现相同的结果,而不放弃预期的效率增益。

谢谢。

标签: python-3.xpandasdictionarytuplesiteration

解决方案


为什么不将 namedtuple 转换为 dict?

wanted = [c for c in df.columns if c != 'D']
for row in df.loc[:, wanted].itertuples():
    result = func(**row._asdict())

您还可以将数据框转换为 dict 列表

wanted = [c for c in df.columns if c != 'D']
for kwargs in df.loc[:, wanted].to_dict('records'):
    result = func(**kwargs)

推荐阅读