1

迭代数据框时是否有一种简单的方法来引用前一行?在以下数据框中,我希望 B 列何时更改为 1,A > 1并保持为 1 A < -1,直到它更改为 -1。

In [11]: df
Out[11]:
                    A    B
2000-01-01  -0.182994    0
2000-01-02   1.290203    0
2000-01-03   0.245229    0
2000-01-08  -1.230742    0
2000-01-09   0.534939    0
2000-01-10   1.324027    0

这是我试图做的,但显然你不能只从索引中减去 1:

for idx,row in df.iterrows():
    if df["A"][idx]<-1:
        df["B"][idx] = -1
    elif df["A"][idx]>1:
        df["B"][idx] = 1
    else: 
        df["B"][idx] = df["B"][idx-1] 

我也尝试过使用get_loc但完全迷路了,我确定我错过了一个非常简单的解决方案!

4

3 回答 3

1

这就是你想要做的?

In [38]: df = DataFrame(randn(10,2),columns=list('AB'))

In [39]: df['B'] = np.nan

In [40]: df.loc[df.A<-1,'B'] = -1

In [41]: df.loc[df.A>1,'B'] = 1

In [42]: df.ffill()
Out[42]: 
          A  B
0 -1.186808 -1
1 -0.095587 -1
2 -1.921372 -1
3 -0.772836 -1
4  0.016883 -1
5  0.350778 -1
6  0.165055 -1
7  1.101561  1
8 -0.346786  1
9 -0.186263  1
于 2013-05-22T17:54:26.380 回答
1

这里有类似的问题:使用 map 或 apply 参考上一行中的值
我的印象是 pandas 应该处理迭代,我们不应该自己做......因此,我选择使用 DataFrame 'apply' 方法。

这是我在上面链接的其他问题上发布的相同答案...

您可以使用 dataframe 'apply' 函数并利用未使用的 'kwargs' 参数来存储前一行。

import pandas as pd

df = pd.DataFrame({'a':[0,1,2], 'b':[0,10,20]})

new_col = 'c'

def apply_func_decorator(func):
    prev_row = {}
    def wrapper(curr_row, **kwargs):
        val = func(curr_row, prev_row)
        prev_row.update(curr_row)
        prev_row[new_col] = val
        return val
    return wrapper

@apply_func_decorator
def running_total(curr_row, prev_row):
    return curr_row['a'] + curr_row['b'] + prev_row.get('c', 0)

df[new_col] = df.apply(running_total, axis=1)

print(df)
# Output will be:
#    a   b   c
# 0  0   0   0
# 1  1  10  11
# 2  2  20  33

此示例使用装饰器将前一行存储在字典中,然后在 Pandas 在下一行调用它时将其传递给函数。

免责声明 1:“prev_row”变量在第一行开始为空,因此在应用函数中使用它时,我必须提供默认值以避免“KeyError”。

免责声明 2:我相当肯定这会减慢应用操作,但我没有做任何测试来确定多少。

于 2016-07-02T00:11:20.403 回答
1

试试这个:如果第一个值既不是,也不是 设置为>= 1或 任何你喜欢的。< -10

df["B"] = None
df["B"] = np.where(df['A'] >= 1, 1,df['B'])
df["B"] = np.where(df['A'] < -1, -1,df['B'])
df = df.ffill().fillna(0)

这解决了所述问题,但引用前一行的真正解决方案是使用 .shift().index() -1

于 2016-07-02T01:07:32.523 回答