这个问题最好用一个例子来扩展:
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)
这里的具体目标是复制上面的示例,但为了提高效率,部署itertuple而不是iterrows。然而,当切换到iterraws时,我不确定如何操作pandas.core.frame.pandas对象,即以类似的方式为每一行生成的熊猫命名元组,以实现与iterraws函数生成的pandas.core系列对象的操作相同的目标。
想法如下:
for kwargs in df.itertuples():
kwargs.pop('D')
result = func(**kwargs)
当然,for循环中的两行都不起作用,因为新的迭代方法产生了不同的对象。如何在不放弃预期效率收益的情况下,直接(我还没有找到等效的方法(或间接地重写这一点以获得相同的结果。
谢谢。
为什么不将名称元组转换为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)