python – 在groupby pandas之后过滤行

python – 在groupby pandas之后过滤行,第1张

概述我在熊猫里有一张桌子: import pandas as pddf = pd.DataFrame({ 'LeafID':[1,1,2,1,3,3,1,6,3,5,1], 'pidx':[10,10,300,10,30,40,20,10,30,45,20], 'pidy':[20,20,400,20,15,20,12,43,54,112,23], 'count': 我在熊猫里有一张桌子:
import pandas as pddf = pd.DataFrame({    'LeafID':[1,1,2,3,6,5,1],'pIDx':[10,10,300,30,40,20,45,20],'pIDy':[20,400,15,12,43,54,112,23],'count':[10,80,50,70],'score':[10,22,4,9,1]})LeafID  count       pIDx     pIDy   score0   1       10           10        20     101   1       20           10        20     102   2       30          300       400     103   1       40           10        20     224   3       80           30        15     225   3       10           40        20      36   1       20           20        12      47   6       50           10        43      58   3       30           20        54      99   5       10           45       112      010  1       70           20        23      1

我想做一个groupby,然后过滤pIDx大于2的行.

也就是说,过滤pIDx为10和20的行.

我尝试使用df.groupby(‘pIDx’).count()但它没有帮助我.同样对于那些行,我必须做0.4 *计数0.6 *得分.

期望的输出是:

LeafID    count       pIDx     pIDy    final_score   1       10           10        20   1       20           10        20   1       40           10        20   6       50           10        43   1       20           20        12   3       30           20        54   1       70           20        23
解决方法 您可以在 boolean indexingisin中使用 value_counts
df = pd.DataFrame({    'LeafID':[1,1]})print (df)    LeafID  count  pIDx  pIDy  score0        1     10    10    20     101        1     20    10    20     102        2     30   300   400     103        1     40    10    20     224        3     80    30    15     225        3     10    40    20      36        1     20    20    12      47        6     50    10    43      58        3     30    30    54      99        5     10    45   112      010       1     70    20    23      1s = df.pIDx.value_counts()IDx = s[s>2].indexprint (df[df.pIDx.isin(IDx)])   LeafID  count  pIDx  pIDy  score0       1     10    10    20     101       1     20    10    20     103       1     40    10    20     227       6     50    10    43      5

时序:

np.random.seed(123)N = 1000000L1 = List('abcdefghijklmnopqrstu')L2 = List('efghijklmnopqrstuvwxyz')df = pd.DataFrame({'LeafID':np.random.randint(1000,size=N),'pIDx': np.random.randint(10000,'pIDy': np.random.choice(L2,N),'count':np.random.randint(1000,size=N)})print (df)print (df.groupby('pIDx').filter(lambda x: len(x) > 120))def jez(df):    s = df.pIDx.value_counts()    return df[df.pIDx.isin(s[s>120].index)]print (jez(df))In [55]: %timeit (df.groupby('pIDx').filter(lambda x: len(x) > 120))1 loop,best of 3: 1.17 s per loopIn [56]: %timeit (jez(df))10 loops,best of 3: 141 ms per loopIn [62]: %timeit (df[df.groupby('pIDx').pIDx.transform('size') > 120])10 loops,best of 3: 102 ms per loopIn [63]: %timeit (df[df.groupby('pIDx').pIDx.transform(len) > 120])1 loop,best of 3: 685 ms per loopIn [64]: %timeit (df[df.groupby('pIDx').pIDx.transform('count') > 120])10 loops,best of 3: 104 ms per loop

对于final_score,您可以使用:

df['final_score'] = df['count'].mul(.4).add(df.score.mul(.6))
总结

以上是内存溢出为你收集整理的python – 在groupby pandas之后过滤行全部内容,希望文章能够帮你解决python – 在groupby pandas之后过滤行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存