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

           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

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


当前回答

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

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

其他回答

好吧,如果你无论如何都要迭代,为什么不使用最简单的方法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

Pandas DataFrame object should be thought of as a Series of Series. In other words, you should think of it in terms of columns. The reason why this is important is because when you use pd.DataFrame.iterrows you are iterating through rows as Series. But these are not the Series that the data frame is storing and so they are new Series that are created for you while you iterate. That implies that when you attempt to assign tho them, those edits won't end up reflected in the original data frame.

好了,现在问题已经解决了:我们该怎么做?

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

pd.DataFrame。set_value在Pandas 0.21版已弃用 pd.DataFrame.ix已弃用 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

你应该用df来赋值。ix[i, 'exp']=X或df。loc[i, 'exp']=X而不是df。Ix [i]['ifor'] = x。

否则,你正在处理一个视图,并且应该得到一个温暖:

-c:1: SettingWithCopyWarning:一个值正在试图从一个DataFrame的切片副本上设置。 尝试使用.loc[row_index,col_indexer] = value代替

但可以肯定的是,循环应该被一些矢量化算法所取代,以充分利用@Phillip Cloud所建议的DataFrame。

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

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

列表理解可以是一个选项。

df['new_column'] = [your_func(x) for x in df['column']]

这将遍历列df['column'],使用来自df['column']的值调用函数your_func,并为新列df['new_column']中的行赋值。

请不要忘记创建一个函数。