如何专门操作通过 itertuples 生成的命名元组以删除元素并从剩余元素生成字典?

How can I manipulate a named tuple produced via itertuples specifically to remove an element and produce a dictionary from the remaining elements?

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

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.core.series.Series iterrows 函数生成的对象。

想法是这样的:

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

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

谢谢。

为什么不将 namedtuple 转换为字典?

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

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

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