当前位置: 首页 > 知识库问答 >
问题:

逐行迭代时更新pandas中的数据帧

农均
2023-03-14

我有一个熊猫数据框,看起来像这样(它是一个相当大的)

           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

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

共有3个答案

安博文
2023-03-14

您可以使用的方法是itertuples(),它以命名元组的形式迭代DataFrame行,索引值作为元组的第一个元素。而且它比iterrow()要快得多。对于itertuples(),每个在DataFrame中包含其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

在大多数情况下,itertuples()iatat更快。

谢谢@SantiStSupery,使用。atloc快得多。

陶刚豪
2023-03-14

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

好了,现在这已经不成问题了:我们该怎么办?

在这篇文章之前的建议包括:

  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 <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

如果我需要将前一行的值用于if条件,该怎么办?

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

黄元章
2023-03-14

您可以使用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循环,以防您需要这里未显示的某些内容的行值。

使现代化

自版本0.21.0以来,df.set_value()已被弃用。您可以改用df.at()

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        ifor_val = something_else
    df.at[i,'ifor'] = ifor_val
 类似资料:
  • 我有一个来自熊猫的: 输出: 现在我要迭代这个帧的行。对于每一行,我希望能够通过列的名称访问其元素(单元格中的值)。例如: 有可能在熊猫身上做到这一点吗? 我发现了这个类似的问题。但它并没有给我我需要的答案。例如,在那里建议使用: 或 但我不理解对象是什么,以及如何使用它。

  • 在编程方面,我是一个新手,特别是熊猫。我也很抱歉,我问了一个已经在SF上提到的问题:我并不真正理解这个问题的现有答案。可能重复,但这个答案对新手来说很容易理解,如果不太全面的话。

  • 我需要对pandas数据帧进行迭代,以便将每一行作为带有的函数(实际上是类构造函数)的参数传递。这意味着每一行都应该像字典一样,具有键、列名和值(每行对应的值)。

  • 我有客户对象的列表。我想迭代列表并按1递增顺序。 我尝试了每个列表,但在这里我必须创建新列表并在其中添加值。 有没有更好的方法?我尝试使用streams,但它只是映射订单

  • 数据帧: 我有一段代码逐列遍历数据帧: 我需要删除它是NaN的行。我该怎么做?我已经尝试了. isnull()和. Notnull(),但它们返回错误

  • 我想在字符串与给定值匹配时更新该值 有没有人可以使用Java streams API来实现上述功能