簡體   English   中英

基於其他行的過去值到當前值的新行

[英]New row based on other's row past value to current value

我正在嘗試在df中創建一個名為move的新列,如果x is higher的值x is higher其先前值,則該列的值為1如果該值value is lower ,則其value is lower 0 ,因此move的第一個值應為NaN

d = {'x': [1, 0, 2, 5, 4]}
df = pandas.DataFrame(d)

該列應如下所示:

df['move'] = pandas.Series([NaN, 0, 1, 1, 0])

您可以使用shift與使用iloc的列切片進行比較,並使用iloc將布爾系列轉換為數字astype

In [82]:
df['move'] = (df['x'].iloc[1:] > df['x'].iloc[1:].shift()).astype(int)
df

Out[82]:
   x  move
0  1   NaN
1  0   0.0
2  2   1.0
3  5   1.0
4  4   0.0

請注意, NaN的存在會迫使dtype在此處float

我認為您需要與x列中的shift ed值進行比較,最后可以將第一個值更改為NaN (如有必要):

df['move'] = (df.x > df.x.shift()).astype(int)
df.ix[0, 'move'] = np.nan
print (df)
   x  move
0  1   NaN
1  0   0.0
2  2   1.0
3  5   1.0
4  4   0.0

時間

len(df)=50k

In [82]: %timeit (edch(df1))
100 loops, best of 3: 3.99 ms per loop

In [83]: %timeit (jez(df))
1000 loops, best of 3: 1.44 ms per loop

計時代碼

d = {'x': [1, 0, 2, 5, 4]}
df = pd.DataFrame(d)
df = pd.concat([df]*10000).reset_index(drop=True)
df1 = df.copy()

def jez(df):
    df['move'] = (df.x > df.x.shift()).astype(int)
    df.ix[0, 'move'] = np.nan
    return df

def edch(df):
    df['move'] = (df['x'].iloc[1:] > df['x'].iloc[1:].shift()).astype(int)
    return df

print (jez(df))
print (edch(df1))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM