我有一个熊猫数据帧,看起来像这样(它非常大)

           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

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


当前回答

你可以使用的一个方法是itertuples(),它迭代DataFrame行作为命名元组,索引值作为元组的第一个元素。与iterrows()相比,它要快得多。对于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()比iat或at快。

谢谢@SantiStSupery,使用。at比loc快得多。

其他回答

最好使用df.apply() -来使用lambda函数

df["ifor"] = df.apply(lambda x: {value} if {condition} else x["ifor"], axis=1)

你可以使用的一个方法是itertuples(),它迭代DataFrame行作为命名元组,索引值作为元组的第一个元素。与iterrows()相比,它要快得多。对于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()比iat或at快。

谢谢@SantiStSupery,使用。at比loc快得多。

你可以使用df.at:

for i, row in df.iterrows():
    ifor_val = something
    if <condition>:
        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 <condition>:
        ifor_val = something_else
    df.set_value(i,'ifor',ifor_val)

如果你不需要行值,你可以简单地遍历df的索引,但我保留了原始的for循环,以防你需要行值来处理这里没有显示的东西。

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

好吧,如果你无论如何都要迭代,为什么不使用最简单的方法df['Column'].values[i]

df['Column'] = ''

for i in range(len(df)):
    df['Column'].values[i] = something/update/new_value

或者如果你想比较新值和旧值或者类似的东西,为什么不把它存储在一个列表中,然后在最后追加。

mylist, df['Column'] = [], ''

for <condition>:
    mylist.append(something/update/new_value)

df['Column'] = mylist