如何操作通过 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 生成的命名元组专门删除一个元素并从剩余元素中生成一个字典?的主要内容,如果未能解决你的问题,请参考以下文章