在pandas中更新数据帧,同时按

2024-04-25 23:52:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个像这样的熊猫数据框(它相当大)

           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

这些方法似乎都不起作用。我看不到数据框中更新的值。


Tags: 数据indffordateif条件else
3条回答

可以使用的方法是^{},它作为namedtuples在数据帧行上迭代,索引值作为元组的第一个元素。它比iterrows()快得多。对于itertuples(),每个row在数据帧中包含其Index,您可以使用loc来设置该值。

for row in df.itertuples():
    if <something>:
        df.at[row.Index, 'ifor'] = x
    else:
        df.at[row.Index, 'ifor'] = x

    df.loc[row.Index, 'ifor'] = x

谢谢@SantiStSupery,using ^{} is much faster

可以使用df.set_value在循环中分配值:

for i, row in df.iterrows():
  ifor_val = something
  if <condition>:
    ifor_val = something_else
  df.set_value(i,'ifor',ifor_val)

如果不需要行值,可以简单地在df的索引上迭代,但是我保留了原始for循环,以防需要这里没有显示的行值。

更新

df.set_value()自0.21.0版以来一直被弃用 您可以使用df.at()代替:

  for i, row in df.iterrows():
      ifor_val = something
      if <condition>:
        ifor_val = something_else
      df.at[i,'ifor'] = ifor_val

应该将Pandas DataFrame对象视为一系列。换句话说,你应该从列的角度来考虑它。之所以如此重要,是因为当您使用pd.DataFrame.iterrows时,您正在以序列的形式遍历行。但它们不是数据帧存储的序列,因此它们是在迭代时为您创建的新序列。这意味着,当您尝试分配它们时,这些编辑不会最终反映在原始数据帧中。

好吧,现在这已经过时了:我们该怎么办?

在此之前的建议包括:

  1. pd.DataFrame.set_valuedeprecated as of Pandas version 0.21
  2. pd.DataFrame.ixdeprecated
  3. pd.DataFrame.loc很好,但是{a3}你可以做得更好

我的建议
使用^{}

for i in df.index:
    if <something>:
        df.at[i, 'ifor'] = x
    else:
        df.at[i, 'ifor'] = y

您甚至可以将此更改为:

for i in df.index:
    df.at[i, 'ifor'] = x if <something> else y

回复评论

and what if I need to use the value of the previous row for the if condition?

for i in range(1, len(df) + 1):
    j = df.columns.get_loc('ifor')
    if <something>:
        df.iat[i - 1, j] = x
    else:
        df.iat[i - 1, j] = y

相关问题 更多 >