为了账号安全,请及时绑定邮箱和手机立即绑定

如何计算一列熊猫DataFrame中的一组

如何计算一列熊猫DataFrame中的一组

守着一只汪 2022-10-18 17:01:39
在数据框中我有列标志,我想在列中计算 1 组df=pd.DataFrame({'flag':[1,1,0,1,0,1,1,0,1,1,1]}) df_out=pd.DataFrame({'groups_of_one_count':[4]}) 
查看完整描述

4 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

使用没有任何附加/连接的 NumPy,再次为了性能 -


a = df.flag.values

out = (a[1:]>a[:-1]).sum() + (a[0]==1)

解释:我们寻找下一个大于前一个的元素。如果满足,则表示一个岛/组的开始1s。我们只是得到总和作为最终输出。对于极端情况,当这样的组从第一个元素开始时,我们单独捕获它。


给定样本的时间按比例放大10000x-


In [64]: df=pd.DataFrame({'flag':[1,1,0,1,0,1,1,0,1,1,1]})


In [65]: df = pd.concat([df]*10000)


# @Quang Hoang's soln

In [66]: %timeit (np.diff(np.append(df.flag.values,0)) == -1).sum()

362 µs ± 26.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


# From this post

In [67]: %%timeit   

    ...: a = df.flag.values

    ...: out = (a[1:]>a[:-1]).sum() + (a[0]==1)

191 µs ± 5.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)


# @jezrael's soln

In [68]: %timeit (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()

1.39 ms ± 8.86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


# @YOBEN_S's soln

In [69]: %timeit df[df.flag.ne(0)].index.to_series().diff().ne(1).sum()

2.92 ms ± 209 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

一般情况(当可能有除 0 和 1 以外的数字时)

该解决方案将通过获取要搜索的数字掩码(1此处)并对其进行操作来修改为这些方面的内容 -


a = df.flag.values

m = a==1

out = (m[1:] & ~m[:-1]).sum() + m[0]


查看完整回答
反对 回复 2022-10-18
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

ne想法是通过不等于比较连续组Series.shift并仅过滤具有以下内容的组1


a = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()

print (a)

4


df_out=pd.DataFrame({'groups_of_one_count':[a]}) 

print (df_out)

   groups_of_one_count

0                    4

详情:


print (df.assign(consec=df['flag'].ne(df['flag'].shift()),

                 eq1 = df['flag'].eq(1),

                 chained = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1))

       ))

    flag  consec    eq1  chained

0      1    True   True     True

1      1   False   True    False

2      0    True  False    False

3      1    True   True     True

4      0    True  False    False

5      1    True   True     True

6      1   False   True    False

7      0    True  False    False

8      1    True   True     True

9      1   False   True    False

10     1   False   True    False


查看完整回答
反对 回复 2022-10-18
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

使用纯 numpy 可以提高性能:

(np.diff(np.append(df.flag.values,0)) == -1).sum()

思路1:统计数据从到跳转的次数0。我们使用为系列以 结尾的情况np.append添加尾随,以便包含最后一个块。01


查看完整回答
反对 回复 2022-10-18
?
开满天机

TA贡献1786条经验 获得超13个赞

首先,我们选择index不等于0,并找到索引diff,如果差异不继续(这里不是eq 1),那就是不同的组:

df[df.flag.ne(0)].index.to_series().diff().ne(1).sum()
4


查看完整回答
反对 回复 2022-10-18
  • 4 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号