在python中更改列值

crcmnpdw  于 2023-03-20  发布在  Python
关注(0)|答案(1)|浏览(97)

我有一个 Dataframe 的形状:
| 第1列|第2列|
| - ------|- ------|
| 0.3 |1个|
| 0.22 |无|
| 0.89 |无|
| 0.12 |1个|
| 0.54 |无|
| 0.11 |1个|
假设此数据集基于时间排序,并且df.iloc[1]df.iloc[2]之前,还假设Col 2是二进制的。
我想做的是按如下方式更改每个Col 2样本的值:df.iloc[i]['Col 2']为1(如果 Dataframe 中接下来的2个样本中有任何一个为1),否则为0。保持 Dataframe 的最后2个元素不变
例如,这里的结果将是:
| 第1列|第2列|
| - ------|- ------|
| 0.3 |无|
| 0.22 |1个|
| 0.89 |1个|
| 0.12 |1个|
| 0.54 |1个|
| 0.11 |1个|
到目前为止我所做的:

for i, j in df.iterrows():
   if i<df.shape[0]-2:
       df.iloc[i]['Col2'] = max([df.iloc[j]['Col2'] for j in range(i,i+2)])

我认为代码工作正常,但由于我的数据集非常大,它需要太多的时间来运行。有没有一个更优雅和计算友好的解决方案?

c0vxltue

c0vxltue1#

我想你想用shift来得到测试列的移位版本,然后把它们加起来并设置阈值。我在下面做了这个,中间的列c留了下来,这样你就可以看到它是如何工作的。最后一列at_least_one应该就是你要找的,如果我没有弄错的话。
编辑:我刚刚尝试了100万行而不是10行,花费了2.6ms。

import numpy as np
import pandas as pd

np.random.seed(0)
test = pd.DataFrame({'a':np.arange(10), 'b':np.random.choice([0,0,1],10)})
test['c'] = test.b.shift(-1) + test.b.shift(-2)
test['at_least_1'] = (test.c > 0).astype(int)

test
>>> 

    a   b   c     at_least_1
0   0   0   0.0     0
1   1   0   0.0     0
2   2   0   0.0     0
3   3   0   1.0     1
4   4   0   1.0     1
5   5   1   1.0     1
6   6   0   1.0     1
7   7   1   0.0     0
8   8   0   NaN     0
9   9   0   NaN     0

相关问题