根据另一列熊猫的300条相邻行中的值创建新列

时间:2019-08-03 19:33:15

标签: python pandas

我想在我的数据框中创建一个新列y,如果我的数据框x列中对应行的接下来的300行全为0,则为True,否则为False(因此,我可以删除具有以下内容的所有行: y =正确)。我这样做的理由是,我只想删除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类型:'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 ... ...

希望这可以澄清!

1 个答案:

答案 0 :(得分:2)

不是100%肯定我能理解您的问题,但是怎么样?

(df['EDA'] == 0).rolling(300).sum().shift(-299) == 300

基本上,您正在做的是构造一个序列,如果value为零,则为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