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

Posted

技术标签:

【中文标题】如何操作通过 itertuples 生成的命名元组专门删除一个元素并从剩余元素中生成一个字典?【英文标题】:How can I manipulate a named tuple produced via itertuples specifically to remove an element and produce a dictionary from the remaining elements? 【发布时间】:2021-06-29 10:44:42 【问题描述】:

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

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

谢谢。

【问题讨论】:

为什么不df[['A', 'B', 'C']].sum(1)?尝试优化 .iter 方法是没有意义的,因为矢量化会将其从水中吹走。 这是一个公平的观点,我的问题并不清楚,但我需要将值作为 kwargs 传递,以便它们可以填充另一个对象作为该对象的属性。该函数仅作为示例。 【参考方案1】:

为什么不将命名元组转换为字典?

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)

【讨论】:

第一个解决方案看起来还需要将参数 index=False 传递给 itertuples 函数。在那种情况下,它似乎提供了我正在寻找的解决方案。谢谢!

以上是关于如何操作通过 itertuples 生成的命名元组专门删除一个元素并从剩余元素中生成一个字典?的主要内容,如果未能解决你的问题,请参考以下文章

panda迭代

python内部如何实现命名元组?

python 可命名元组

如何将元组转换为命名元组?

通过子类化修改命名元组的构造函数参数?

Python冷知识之命名元组