我有一个像这样的熊猫数据框(它相当大)
date exer exp ifor mat
1092 2014-03-17 American M 528.205 2014-04-19
1093 2014-03-17 American M 528.205 2014-04-19
1094 2014-03-17 American M 528.205 2014-04-19
1095 2014-03-17 American M 528.205 2014-04-19
1096 2014-03-17 American M 528.205 2014-05-17
现在我想逐行迭代,当我遍历每一行时,ifor
的值
在每一行中,可以根据某些条件进行更改,我需要查找另一个数据帧。
现在,我如何在迭代时更新它。 尝试了一些没用的东西。
for i, row in df.iterrows():
if <something>:
row['ifor'] = x
else:
row['ifor'] = y
df.ix[i]['ifor'] = x
这些方法似乎都不起作用。我看不到数据框中更新的值。
可以使用的方法是^{} ,它作为namedtuples在数据帧行上迭代,索引值作为元组的第一个元素。它比
iterrows()
快得多。对于itertuples()
,每个row
在数据帧中包含其Index
,您可以使用loc
来设置该值。谢谢@SantiStSupery,using ^{} is much faster 。
可以使用df.set_value在循环中分配值:
如果不需要行值,可以简单地在df的索引上迭代,但是我保留了原始for循环,以防需要这里没有显示的行值。
更新
df.set_value()自0.21.0版以来一直被弃用 您可以使用df.at()代替:
应该将Pandas DataFrame对象视为一系列。换句话说,你应该从列的角度来考虑它。之所以如此重要,是因为当您使用
pd.DataFrame.iterrows
时,您正在以序列的形式遍历行。但它们不是数据帧存储的序列,因此它们是在迭代时为您创建的新序列。这意味着,当您尝试分配它们时,这些编辑不会最终反映在原始数据帧中。好吧,现在这已经过时了:我们该怎么办?
在此之前的建议包括:
pd.DataFrame.set_value
是deprecated as of Pandas version 0.21pd.DataFrame.ix
是deprecatedpd.DataFrame.loc
很好,但是{a3}你可以做得更好我的建议}
使用^{
您甚至可以将此更改为:
回复评论
相关问题 更多 >
编程相关推荐