基于其他行过去值到当前值的新行
New row based on other's row past value to current value
我正在尝试在 df
中创建一个名为 move
的新列,如果 x is higher
中的值比其先前的值高,则给出 1
的值,并且a 0
如果 value is lower
,那么 move
中的第一个值应该是 NaN
.
d = {'x': [1, 0, 2, 5, 4]}
df = pandas.DataFrame(d)
该列应如下所示:
df['move'] = pandas.Series([NaN, 0, 1, 1, 0])
您可以使用 shift
与使用 iloc
的列的一部分进行比较,并使用 astype
:
将布尔系列转换为数字 dtype
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))
我正在尝试在 df
中创建一个名为 move
的新列,如果 x is higher
中的值比其先前的值高,则给出 1
的值,并且a 0
如果 value is lower
,那么 move
中的第一个值应该是 NaN
.
d = {'x': [1, 0, 2, 5, 4]}
df = pandas.DataFrame(d)
该列应如下所示:
df['move'] = pandas.Series([NaN, 0, 1, 1, 0])
您可以使用 shift
与使用 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))