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

标签 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 的方法来做到这一点?

最佳答案

假设 Split 是唯一的 bool 列,并且其他所有内容本质上都是数字,您可以只获取 cumsum 并相应地使用 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

这些远不如 loc 的索引选项高效,因为它涉及大量冗余计算。

关于python - 在行中出现某个项目后,更改数据框中的所有行。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513626/

相关文章:

php - 以编程方式检查网站重定向

python - 无法导入QUERY_TERMS

python - 如何使用 SQL 参数

python - 分组之间的列之间的差异发生了移动

python - 使用 Pandas 从字符串列表中提取某些元素并转换为日期时间

dataframe - 在 Julia 中使用 DataFrames.transform 重用字段进行许多计算?

python - Pyspark 数据框使用默认值左连接

python - 递归和动态规划的不同结果

python - 来自循环的堆积条形图不添加不同的条形组件

python - 从大数据框中选择特定行