python - Pandas - 创建一个新列,其值在旧列中每次出现值 X 时增加

标签 python pandas dataframe

我有一个具有以下结构的 DataFrame:

    A  

0   1   
1   2   
2   3   
3   1   
4   2   
5   1   
6   2
7   3

现在我想创建一个新的 B 列,从 0 开始,它的值随着 A 列中每次出现 1 而递增。所以上面的数据框应该如下所示:

    A   B

0   1   0
1   2   0
2   3   0
3   1   1
4   2   1
5   1   2 
6   2   2
7   3   2

请注意,A 中 1 的出现没有规律。

我现在的代码是:

def _add_col_B(data):

  data['B'] = -1

  ones = list((data.index[data['A'] == 1]))
  ones.append(len(data))

  sent = 0
  for i in range(len(ones)-1):
      data.loc[ones[i] : ones[i+1],:]['B'] = sent
      sent = sent + 1

  return data

%timeit -r 3 _add_col_B(data)
10 loops, best of 3: 184 ms per loop

但在我看来,它非常慢,尤其是考虑到我需要对非常大的数据帧重复执行此操作这一事实。有没有矢量化的方式来做到这一点?

最佳答案

采用矢量化方法,您可以编写:

df['B'] = (df['A'] == 1).cumsum() - 1

产生数据帧:

   A  B
0  1  0
1  2  0
2  3  0
3  1  1
4  2  1
5  1  2
6  2  2
7  3  2

关于python - Pandas - 创建一个新列,其值在旧列中每次出现值 X 时增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33064080/

相关文章:

python - 交叉验证、scikit-learn、并行较慢

python - 使用居中 .rolling() 后,用第一个计算总和替换 Pandas DataFrame 列中的 NaN 值

python - 将函数逐元素应用于两个 DataFrame

python - 如何根据 python(pandas)中的用户输入删除列?

scala - Spark中如何将字符串转换为日期格式

r - 将函数应用于data.frame中的每个元素并返回data.frame

python - pylint:让它理解装饰器

python - 将整个程序包含在一个类中有什么好处?

python - 由 Python 多处理 fork 的空 python 进程的私有(private)内存

python - 使用matplotlib和mysql数据库创建散点图