python pandas 行数_python – 按行值pandas的某些组合计算行数

news/2024/6/18 4:36:23

我有一个像这样的数据帧(df):

v1 v2 v3

0 -30 -15

0 -30 -7.5

0 -30 -11.25

0 -30 -13.125

0 -30 -14.0625

0 -30 -13.59375

0 -10 -5

0 -10 -7.5

0 -10 -6.25

0 -10 -5.625

0 -10 -5.9375

0 -10 -6.09375

0 -5 -2.5

0 -5 -1.25

0 -5 -1.875

如果具有特定/相同的v1和v2,则行在相同的块中.在这种情况下,行具有([0,-30],[0,-10],[0,-5]).我想以块的形式分割行并计算此块中的行数.如果行的长度不是6,则删除整个块,否则,保留此块.

我粗略的代码:

v1_ls = df.v1.unique()

v2_ls = df.v2.unique()

for i, j in v1_ls, v2_ls:

chunk[i] = df[(df['v1'] == v1_ls[i]) & df['v2'] == v2_ls[j]]

if len(chunk[i])!= 6:

df = df[df != chunk[i]]

else:

pass

预期产量:

v1 v2 v3

0 -30 -15

0 -30 -7.5

0 -30 -11.25

0 -30 -13.125

0 -30 -14.0625

0 -30 -13.59375

0 -10 -5

0 -10 -7.5

0 -10 -6.25

0 -10 -5.625

0 -10 -5.9375

0 -10 -6.09375

谢谢!

解决方法:

我认为在v1和v2中没有NaN,所以使用transform size:

df = df[df.groupby(['v1', 'v2'])['v2'].transform('size') == 6]

print (df)

v1 v2 v3

0 0 -30 -15.00000

1 0 -30 -7.50000

2 0 -30 -11.25000

3 0 -30 -13.12500

4 0 -30 -14.06250

5 0 -30 -13.59375

6 0 -10 -5.00000

7 0 -10 -7.50000

8 0 -10 -6.25000

9 0 -10 -5.62500

10 0 -10 -5.93750

11 0 -10 -6.09375

详情:

print (df.groupby(['v1', 'v2'])['v2'].transform('size') == 6)

0 True

1 True

2 True

3 True

4 True

5 True

6 True

7 True

8 True

9 True

10 True

11 True

12 False

13 False

14 False

Name: v2, dtype: bool

不幸的是过滤器真的很慢,所以如果需要更好的性能使用转换:

np.random.seed(123)

N = 1000000

L = list('abcdefghijkl')

df = pd.DataFrame({'v1': np.random.choice(L, N),

'v2':np.random.randint(10000,size=N),

'value':np.random.randint(1000,size=N),

'value2':np.random.randint(5000,size=N)})

df = df.sort_values(['v1','v2']).reset_index(drop=True)

print (df.head(10))

In [290]: %timeit df.groupby(['v1', 'v2']).filter(lambda x: len(x) == 6)

1 loop, best of 3: 12.1 s per loop

In [291]: %timeit df[df.groupby(['v1', 'v2'])['v2'].transform('size') == 6]

1 loop, best of 3: 176 ms per loop

In [292]: %timeit df[df.groupby(['v1', 'v2']).v2.transform('count').eq(6)]

10 loops, best of 3: 175 ms per loop

N = 1000000

ngroups = 1000

df = pd.DataFrame(dict(A = np.random.randint(0,ngroups,size=N),B=np.random.randn(N)))

In [299]: %timeit df.groupby('A').filter(lambda x: len(x) > 1000)

1 loop, best of 3: 330 ms per loop

In [300]: %timeit df[df.groupby(['A'])['A'].transform('size') > 1000]

10 loops, best of 3: 101 ms per loop

警告

考虑到组的数量,结果不能解决性能问题,这将对某些解决方案的时序产生很大影响.

标签:python,count,dataframe,pandas,row

来源: https://codeday.me/bug/20190722/1500810.html


http://www.niftyadmin.cn/n/3661269.html

相关文章

[豆趣]去火

2007年02月04日 21:14:00 托领导的福,在靠近年关的时间,回家休了个病假。 病得不轻,整宿睡不着,去看医生,医生说我是"抑郁症"的早期。不错不错,看来我还年轻,还有这心情赶这个时髦。以…

js将数据以表格形式显示_数据回传的三种形式:JS、API和SDK

在广告投放进入到ocpc阶段后,数据回传开始深入人心,很多人都知道数据回传的三种基本形式:JS、API以及SDK,对于他们之间的区别可能不太了解,这三种形式看似差异很大,但是实质都是一样的,他们都只…

mysql保存测试数据_Mysql自动填充测试数据

前言最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存储过程以及自动填充…

[个人]加入了ruby hacking guide的中文翻译团队

2007年02月04日 11:38:00 一种语言,除了语言规范之外,或许会有若干种实现。javascript是这样,虽然大家都号称要遵守ECMAScript 262规范,但是微软的实现和蜘蛛猴的实现显然是存在一些差异的;java是这样的,即…

oracle管理mysql_Oracle和MySQL的区别

1.语法不同,两者语法有所不同2)Mysql中group by可以使用别名,Oracle 中不可以3)聚合函数分组Oracle中出现在select列表中的字段或者出现在order by后面的字段,如果不是包含在分组函数中,那么该字段必须同时在group by子句中出现。…

[领域] JavaScript Hacking Guide part2

2007年02月02日 14:34:00 感谢超德和梁健,你们是我前进的动力。昨天贴出来的,只能算是初步的编程模型,如果想弄清楚javascript的内存模型,必须看这幅图,不过这幅图还有一些简化的部分。以后会用程序来验证和说明这幅图…

mysql 表的crud_MySQL表的CRUD及多表查询

书名 作者 出版社 价格 出版日期(publish_date)倚天屠龙记 egon 北京工业地雷出版社 70 2019-7-1九阳神功 alex 人民音乐不好听出版社 5 2018-7-4九阴真经 yuan 北京工业地雷出版社 62 2017-7-12九阴白骨爪 jin 人民音乐不好听出版社 40 2019–8-7独孤九剑 alex 北京工业地雷出…

[个人]排错记

2007年03月07日 18:12:00 没想到,年后的第一博,居然是记录自己的一些坏心情。鱼DD和茂DD最后选择了离开,我能够理解他们,与他们认识已经5年多了,知道他们的烦恼忧愁,不想去阻拦他们,除了不舍&am…