首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在计算连续值的熊猫数据中的新变量

在计算连续值的熊猫数据中的新变量
EN

Stack Overflow用户
提问于 2019-04-18 00:37:31
回答 3查看 180关注 0票数 3

我有一个熊猫数据(从excel导入),由两个变量组成,f只是一个数字,另一个是布尔值,如果这个数字超出了范围。

我想要创建一个新的变量来计算连续的真实值。

我在网上读了一些,我认为这个新变量可以使用连续计数,但我不知道如何将它实现到这个dataframe。

最后的dataframe应该如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f   outrange  count
1    F       0
2    F       0 
3    T       1
4    T       2
1    F       0
3    T       1
2    F       0
3    T       1  
4    T       2

我对python非常陌生,如果这个问题的措辞不正确,我很抱歉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-18 01:18:13

我使用了自己的数据作为输入。列'A‘对应于'outrange’列,'B‘对应于'count’列。请用你的实际数据进行测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np 
import pandas as pd

df = pd.DataFrame(data{'A':['F','T','T','T','F','F','F','T','F','F','F','T','T','F','F','F']})
counter = 0

def conditional_cumulative_sum(x):
    global counter

    if x == 'F':
        counter = 0
        return counter
    elif x == 'T':
        counter += 1
        return counter
df['B'] = df['A'].apply(conditional_cumulative_sum)
票数 1
EN

Stack Overflow用户

发布于 2019-04-18 01:27:46

使用矢量化解决方案替换T值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = df['outrange'] == 'T'
#if values are boolean True
#a = df['outrange']
b = a.cumsum()
df['count_new'] = b-b.where(~a).ffill().fillna(0).astype(int)
print (df)
   f outrange  count  count_new
0  1        F      0          0
1  2        F      0          0
2  3        T      1          1
3  4        T      2          2
4  1        F      0          0
5  3        T      1          1
6  2        F      0          0
7  3        T      1          1
8  4        T      2          2

性能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#90k
df = pd.concat([df] * 10000, ignore_index=True)

In [183]: %%timeit
     ...: a = df['outrange'] == 'T'
     ...: b = a.cumsum()
     ...: df['count_new'] = b-b.where(~a).ffill().fillna(0).astype(int)
     ...: 
7.83 ms ± 28.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [184]: %%timeit
     ...: df['B'] = df['outrange'].apply(conditional_cumulative_sum)
     ...: 
35.9 ms ± 295 µs p
票数 4
EN

Stack Overflow用户

发布于 2019-04-18 02:04:34

也许用字典比较容易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr = np.array([0,0,1,1,0,1,0,1,1]) #your array of booleans

dct = {k:0 if arr[k]<1 else 1 for k in range(len(arr))}

c = 0
for i in arr:
  if i > 0 and dct[c-1]>0:
     dct[c] = 1 + dct[c-1]
  c = c+1

pd.DataFrame([arr,dct.values()],index=["outofrange","count"]).T

#outofrange count
0           0
0           0
1           1 
1           2
0           0
1           1 
0           0
1           1
1           2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55742177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文