Python Pandas iterrows()具有以前的值

时间:2014-08-24 15:14:43

标签: python for-loop pandas dataframe

我的形式有一个pandas Dataframe:

            A           B       K      S
2012-03-31  NaN         NaN     NaN    10
2012-04-30  62.74449    15.2    71.64   0
2012-05-31  2029.487    168.8   71.64   0
2012-06-30  170.7191    30.4    71.64   0

我尝试使用df ['S'] [index-1]值创建一个替换df ['S']的函数。

例如:

for index,row in df.iterrows:
     if index = 1: 
         pass
     else:
         df['S'] = min(df['A'] + df['S'][index-1]?? - df['B'], df['K'])

但我不知道如何获得df ['S'] [index - 1]

2 个答案:

答案 0 :(得分:1)

iterrows的目的是一次操作一行,因此您将无法访问之前的行。 无论如何,你的功能会很慢,并且有更快的方法:

df['S_shifted'] = df.S.shift()

compared = pd.concat([df['A'] + df['S_shifted'] - df['B'], df['K']], axis=1)

df['S'] = compared.min(axis=1)

In [29]: df['S']
Out[29]: 
2012-03-31         NaN
2012-04-30    57.54449
2012-05-31    71.64000
2012-06-30    71.64000
Name: S, dtype: float64

答案 1 :(得分:0)

您的最初答案似乎非常接近。

以下方法应该起作用:

for index, row in df.iterrows():
    if df.loc[index, 'S'] != 0:
        df.loc[index, 'S'] = df.loc[str(int(index) - 1), 'S']

本质上,对于除第一个索引(即0)以外的所有索引,将“ S”列中的值更改为其前一行中的值。注意:这假定数据帧具有顺序的,有序的索引。

iterrows()方法不允许您通过单独调用该行来修改值,因此您需要使用df.loc()来标识数据帧中的单元格,然后更改其值。 / p>

还值得注意的是index不是整数,因此使用int()函数减去1。所有这些都在str()函数中,以便最终索引输出是一个字符串,符合预期。