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

我有一个像这样的数据帧(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值