在逐行迭代中更新pandas中的数据框。

15 浏览
0 Comments

在逐行迭代中更新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日
0
0 Comments

Pandas的DataFrame对象应该被视为一系列Series。换句话说,您应该根据列来考虑。这个非常重要的原因是,当您使用 pd.DataFrame.iterrows 时,您正在遍历行作为Series。但是这些是数据框存储的Series,因此它们是在您迭代时为您创建的新Series。这意味着,当您尝试分配它们时,这些编辑不会反映在原始数据帧中。

好的,现在这已经解决了:我们应该怎么办呢?

在此帖子之前建议的包括:

  1. pd.DataFrame.set_value已经在Pandas 0.21版本中弃用
  2. pd.DataFrame.ix已经弃用
  3. 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 if  else 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

0
0 Comments

您可以使用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循环,以防您需要行值来处理其他事情(此处未展示)。

0