在行中的项目出现后,更改数据框中的所有行。

时间:2018-01-30 03:53:41

标签: python pandas dataframe

说我有这样的数据框:

Open Close Split
144 144 False
142 143 False
... ... ...
138 139 False
72 73 True
72 74 False
75 76 False
... ... ...
79 78 False

显然,数据框可能非常大,可能包含其他列,但这是核心。

我的最终目标是调整所有数据以考虑拆分,到目前为止,我已经能够确定拆分("拆分"列)

现在,我正在寻找一种优雅的方法,在分割前将所有内容除以2,或者将分割后的所有内容乘以2。

我认为最好的方法可能是将True向下传播到底部,然后在" Split"中将所有包含True的行相乘。专栏,但有更多的Pythonic方式吗?

3 个答案:

答案 0 :(得分:2)

假设Split是唯一的布尔列,并且其他所有内容都是数字的,您可以采用cumsum并相应地设置值{ - 1}} -

loc

m = df.pop('Split').cumsum()

df.loc[m.eq(0)] /= 2    # division before split 
df.loc[m.eq(1)] *= 2    # multiplication after split

这是目前性能最佳的选择。另一种可能的选择涉及df Open Close 0 72.0 72.0 1 71.0 71.5 2 69.0 69.5 3 144.0 146.0 4 144.0 148.0 5 150.0 152.0 6 158.0 156.0 -

np.where

df[:] = np.where(m.eq(0)[:, None], df / 2, df * 2)

或者,

df Open Close 0 72.0 72.0 1 71.0 71.5 2 69.0 69.5 3 144.0 146.0 4 144.0 148.0 5 150.0 152.0 6 158.0 156.0 / df.where -

df.mask

或者,

(df / 2).where(m.eq(0), df * 2)

(df / 2).where(m.ne(0), df * 2)

这些与 Open Close Split 0 72.0 72.0 0 1 71.0 71.5 0 2 69.0 69.5 0 3 144.0 146.0 2 4 144.0 148.0 0 5 150.0 152.0 0 6 158.0 156.0 0 的索引选项一样有效,因为它涉及大量冗余计算。

答案 1 :(得分:0)

另一个基于cumsum的解决方案:

columns = ['Open','Close']
df[columns] = df[columns].mul(df.Split.cumsum() + 1, axis=0)
#   Open  Close  Split
#0   144    144  False
#1   142    143  False
#2   138    139  False
#3   144    146   True
#4   144    148  False
#5   150    152  False
#6   158    156  False

答案 2 :(得分:0)

split_true = df[df['Split'] == True].index[0]
df.iloc[split_true:,:]