在逐行迭代中更新pandas中的数据框。
在逐行迭代中更新pandas中的数据框。
我有一个类似于这样的pandas数据框(它非常大)
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 : row['ifor'] = x else: row['ifor'] = y df.ix[i]['ifor'] = x
这些方法都没有起作用。我看不到数据框中的值被更新。
admin 更改状态以发布 2023年5月21日
Pandas的DataFrame对象应该被视为一系列Series。换句话说,您应该根据列来考虑。这个非常重要的原因是,当您使用 pd.DataFrame.iterrows
时,您正在遍历行作为Series。但是这些不是数据框存储的Series,因此它们是在您迭代时为您创建的新Series。这意味着,当您尝试分配它们时,这些编辑不会反映在原始数据帧中。
好的,现在这已经解决了:我们应该怎么办呢?
在此帖子之前建议的包括:
pd.DataFrame.set_value
已经在Pandas 0.21版本中弃用pd.DataFrame.ix
已经弃用pd.DataFrame.loc
不错,但可以处理数组索引器,您可以做得更好
我的建议
使用pd.DataFrame.at
for i in df.index: if: df.at[i, 'ifor'] = x else: df.at[i, 'ifor'] = y
您甚至可以将此更改为:
for i in df.index: df.at[i, 'ifor'] = x ifelse y
回复评论
如果我需要在if条件中使用前一行的值怎么办?
for i in range(1, len(df) + 1): j = df.columns.get_loc('ifor') if: df.iat[i - 1, j] = x else: df.iat[i - 1, j] = y
您可以使用df.at
:
for i, row in df.iterrows(): ifor_val = something if: ifor_val = something_else df.at[i,'ifor'] = ifor_val
在版本0.21.0之前使用df.set_value
:
for i, row in df.iterrows(): ifor_val = something if: ifor_val = something_else df.set_value(i,'ifor',ifor_val)
如果您不需要行值,您可以简单地遍历df
的索引,但是为了以防万一,我保留了原始的for循环,以防您需要行值来处理其他事情(此处未展示)。