1

データフレームを反復するときに前の行を参照する簡単な方法はありますか? 次のデータフレームでは、列 B がいつ 1に変化し、-1 に変化するA > 1まで 1 のままにしたいと考えA < -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

同様の質問:前の行の値を map または apply で参照します
私の印象では、pandas は反復を処理する必要があり、自分でそれを行う必要はありません。したがって、DataFrame の「適用」メソッドを使用することにしました。

これは、上にリンクされている他の質問に投稿したのと同じ回答です...

データフレームの「適用」機能を使用し、未使用の「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

これはあなたがやろうとしていることですか?

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

これを試してください:最初の値がどちらでもないか、>= 1または < -1 設定されているか、好きなものに設定されて0いる場合。

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 に答える