基于其他行的过去值到当前值的新行

时间:2016-06-27 08:40:38

标签: python pandas dataframe conditional-statements shift

我正在尝试在move中创建一个名为df的新列,如果1中的值超过其之前的值,则会x is higher的值为0 {1}}如果是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])

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:0)

我认为您需要与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))