[英]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.