我已经实现了迭代行的解决方案,但由于数据帧的大小,它需要太长时间。问题是:
我有这样的数据框(忽略前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
我实际上并不关心区间数写入哪一行,或者它可以将列输出到我可以做直方图,平均间隔等的其他地方。
任何方式我都可以在不单独迭代行的情况下做到这一点吗?
答案 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]) ]