Python Pandas计算发生的间隔

时间:2014-10-24 00:22:22

标签: python pandas

我已经实现了迭代行的解决方案,但由于数据帧的大小,它需要太长时间。问题是:

我有这样的数据框(忽略前3列):

D列只有1(True)或0(False)。 0(或False)表示一系列1(或True)的结束。所以第4行中的0意味着在col D中有4个1。再次,在col D中,有两个1' s。然后只有一个1,依此类推。

A B C D
2 3 6 1
4 8 2 1
2 3 6 1
4 8 2 0
2 3 6 1
4 8 2 1
2 3 6 0
4 8 2 0
2 3 6 0
4 8 2 1
2 3 6 1
4 8 2 1
3 4 1 0
...
8 2 3 1
6 2 0 0

我想插入一个专栏' Interval'它显示了这样的间隔。

A B C D Interval
2 3 6 1 
4 8 2 1
2 3 6 1
4 8 2 0 4
2 3 6 1
4 8 2 1
2 3 6 0 3
4 8 2 0 1
2 3 6 0 1
4 8 2 1 
2 3 6 1
4 8 2 1
3 4 1 0 4
...
8 2 3 1
6 2 0 0 2

我实际上并不关心区间数写入哪一行,或者它可以将列输出到我可以做直方图,平均间隔等的其他地方。

任何方式我都可以在不单独迭代行的情况下做到这一点吗?

1 个答案:

答案 0 :(得分:1)

我们可以通过编写迭代列表(D)的函数来实现。我们遍历列表,将计数器初始化为1,每当我们找到一个增量时,只要找到0,我们就会影响该值并重新执行相同的过程。

import pandas as pd
import copy

df = pd.DataFrame([1,1,1,0,1,1,0,0,0,1,1,1,0])

df.columns = ['D']
d= copy.copy(df.D)

def transform(l):
  count=1
  for index,x in enumerate(l): 
    if x==0:
      l[index]=count
      count=1
    else:
      l[index]=0
      count+=1
  return l

df['intervales']=transform(t)
df['D']=d

print df

输出:

     D  intervales
0   1           0
1   1           0
2   1           0
3   0           4
4   1           0
5   1           0
6   0           3
7   0           1
8   0           1
9   1           0
10  1           0
11  1           0
12  0           4

我尝试使用itertools做到这一点,但它导致了很多情况。

# import itertools
# l= [list(g) for k,g in itertools.groupby(df.D,lambda x:x in [0]) ]