我有一个pandas DataFrame
:
d={'gen':['A','A','A','A','B','B','B','B','C','D','D','D','D','D','D','D','D','D','D'], 'diff':pd.Series([1,1,1,1,2,1,1,1,1,1,1,1,1,2,2,1,1,1], index=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17])}
wk = pd.DataFrame(data=d, index=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18])
我的目标是根据diff
计算gen
的出现次数,并使用一些标准:
1.计数diff
是否为1,以及
1.索引i
处的gen
等于索引i+1
处的gen
,以及
1.如果有连续的1,那么计数将是这样的:if(number of consecutive 1)%2 == 0:计数=连续数/2,如果不是:count =(连续次数-1)/2
有了这段代码,我可以实现我想要的:
k=0
j=0
z={}
for i in range(wk.shape[0]):
if wk['diff'][i] == 1:
if wk['gen'][i] == wk['gen'][i+1]:
if j == 0:
j+=2
if j%2==0:
k+=1
if j>=2:
j+=1
z[wk['gen'][i]] = k
if wk['gen'][i] != wk['gen'][i+1]:
j=0
k=0
字典z
的结果是:{'A': 2, 'B': 1, 'D': 4}
但是当我使用更大的数据(超过410,000条记录)时,当索引i
处的gen
不等于索引i+1
处的gen
时,计数器并不总是从0开始。我使用的数据是:link我的代码有什么问题?
1条答案
按热度按时间t40tm48m1#
使用
groupby.count
计算每组连续的1,执行floordiv
乘以2(相当于您的x/2 if x%2==0 else (x-1)/2
),并在转换to_dict
之前再次使用groupby.sum
进行聚合:输出:
中间体
group
和m
: