python - 根据另一列 pandas 的 300 个相邻行中的值创建新列
问题描述
我想在我的数据框中创建一个新列 y,如果我的数据框 x 列中相应行的下 300 行全部为 0,则为 True,否则为 False(所以我可以删除所有具有 y = True 的行)。我这样做的理由是,我只想删除我的数据框中在 x 列中连续有 300 个 0 的所有行。
我的数据集中大约有 150,000 行,因此遍历所有行太慢了。有没有更快的方法来做到这一点?
我已经尝试遍历所有行,这太慢了。我也尝试过类似的东西
for i in range(len(final_agg_df.index)):
final_agg_df["to_delete"][i] = (final_agg_df["EDA"].iloc([[i, i+300]]) == 0).all()
final_agg_df = final_agg_df[final_agg_df["to_delete"]==False]
这似乎不起作用(我收到错误 TypeError: unhashable type: 'list'),而且我也不确定这是否是最快的方法。谢谢!
编辑:我的示例数据将有一个时间戳作为索引,有很多列,其中一个是“EDA”,该列确定我是否要连续删除我的数据。
index EDA
4/8/2019 9:20 3
4/8/2019 9:21 2
4/8/2019 9:22 0
4/8/2019 9:23 1
4/8/2019 9:24 0
4/8/2019 9:25 0
4/8/2019 9:26 0
... ...
在这里,从 2019 年 4 月 8 日 9:24 开始,连续 3 行 EDA = 0。如果一行中有 300 行,我想删除索引为 4/8/2019 9:24 的整行。为此,如果我的行应该被删除,我首先想要一个“True”的新列,所以像这样:
index EDA to_delete
4/8/2019 9:20 3 False
4/8/2019 9:21 2 False
4/8/2019 9:22 0 False
4/8/2019 9:23 1 False
4/8/2019 9:24 0 True
4/8/2019 9:25 0 False
4/8/2019 9:26 0 False
... ...
希望这可以澄清!
解决方案
不是 100% 确定我理解你的问题,但是怎么样?
(df['EDA'] == 0).rolling(300).sum().shift(-299) == 300
基本上你正在做的是构建一个系列,如果值为零,则为 1,否则为 0。
然后,您正在计算窗口为 300 的滚动总和,并将其移回 299 个点。当且仅当该值和下一个 299(因此总共 300)都为零时,这将导致值为 300。
看一个简单的例子,让我们考虑一个更简单的情况,如果一行中有 3 个零,则要删除
让我们考虑
ser = pd.Series([1, 0, 0, 0, 1, 0])
那么如果我们这样做
ser1 = ser == 0
我们得到
0 False
1 True
2 True
3 True
4 False
5 True
正在做
ser2 = ser1.rolling(3).sum()
我们得到
0 NaN
1 NaN
2 2.0
3 3.0
4 2.0
5 2.0
终于在做
ser2.shift(-2) == 3
我们得到
0 False
1 True
2 False
3 False
4 False
5 False
我相信这应该给我们正确的答案,因为当且仅当连续三个 0 时我们才需要一个 True 值,而这里唯一的 True 值是正确的索引 1
推荐阅读
- solr - 如何从 Solr QueryResponse 或 CloudSolrClient 获取默认行
- selenium - 如何在 for 循环中使用“find_elements_by_xpath”
- c# - 如何在移动过程中跟踪手指的位置?
- r - 如何修复“(函数...)参数中的错误意味着不同的行数
- c# - NetMQ 在循环中使用超时轮询代表套接字
- date - 如何在没有辅助列的情况下在公式中定义自定义季度?
- php - 在 registerController 验证中访问 Request 参数
- algorithm - 如何找到具有 1、0、-1 权重的精确 0 成本的多维路径
- pycharm - Pycharm Todo 关键字不在 venv 中的模块中“注册”
- google-sheets - 如果单元格的内容存在于单独的单元格范围中,如何有条件地格式化单元格(在 Google 表格中)?