python dataframe索引遍历是否更快_python-遍历DataFrame并跟踪一定的序列持续时间

我想弄清楚负值出现的频率和负价出现的时间.

例子df

d = {'value': [1,2,-3,-4,-5,6,7,8,-9,-10], 'period':[1,2,3,4,5,6,7,8,10]}

df = pd.DataFrame(data=d)

我检查了哪些行具有负值. df [‘value’]< 0

我以为我可以只遍历每一行,为出现负值时保留一个计数器,并且可以将该行移至另一个df,因为我想保存开始时间和结束时间.

我目前正在尝试什么

def count_negatives(df):

df_negatives = pd.DataFrame(columns=['start','end', 'counter'])

for index, row in df.iterrows():

counter = 0

df_negative_index = 0

while(row['value'] < 0):

# if its the first one add it to df as start ?

# grab the last one and add it as end

#constantly overwrite the counter?

counter += 1

#add counter to df row

df_negatives['counter'] = counter

return df_negatives

我认为除了那给了我一个无限循环.如果我用if代替while,则我想出一种跟踪多长时间的方法.

解决方法:

我认为更好的是避免循环:

#compare by <

a = df['value'].lt(0)

#running sum

b = a.cumsum()

#counter only for negative consecutive values

df['counter'] = b-b.mask(a).ffill().fillna(0).astype(int)

print (df)

value period counter

0 1 1 0

1 2 2 0

2 -3 3 1

3 -4 4 2

4 -5 5 3

5 6 6 0

6 7 7 0

7 8 8 0

8 -9 9 1

9 -10 10 2

或者,如果不需要重置计数器:

a = df['value'].lt(0)

#repalce values per mask a to 0

df['counter'] = a.cumsum().where(a, 0)

print (df)

value period counter

0 1 1 0

1 2 2 0

2 -3 3 1

3 -4 4 2

4 -5 5 3

5 6 6 0

6 7 7 0

7 8 8 0

8 -9 9 4

9 -10 10 5

如果要开始和结束时间:

#comapre for negative mask

a = df['value'].lt(0)

#inverted mask

b = (~a).cumsum()

#filter only negative rows

c = b[a].reset_index()

#aggregate first and last value per groups

df = (c.groupby('value')['index']

.agg([('start', 'first'),('end', 'last')])

.reset_index(drop=True))

print (df)

start end

0 2 4

1 8 9

标签:series,pandas,python

来源: https://codeday.me/bug/20191108/2010233.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值