Python 3.x 熊猫:具有多种条件的groupby

Python 3.x 熊猫:具有多种条件的groupby,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,请你帮我把熊猫数据框按多种条件分组好吗 以下是我在SQL中的操作方法: with a as ( select high ,sum( case when qr = 1 and now = 1 then 1 else 0 end ) q1_bad ,sum( case when qr = 2 and now = 1 then 1 else 0 end ) q2_bad from #tmp2 group by high ) select a.high from a where q1_ba

请你帮我把熊猫数据框按多种条件分组好吗

以下是我在SQL中的操作方法:

with a as (
  select high 
,sum( case when qr = 1 and now = 1 then 1 else 0 end ) q1_bad
,sum( case when qr = 2 and now = 1 then 1 else 0 end ) q2_bad
  from #tmp2
  group by high
)
select a.high from a
where q1_bad >= 2 and q2_bad >= 2 and a.high is not null
以下是数据集的一部分:

import pandas as pd
a = pd.DataFrame()

a['client'] = range(35)
a['high'] = ['02','47','47','47','79','01','43','56','46','47','17','58','42','90','47','86','41','56',
'55','49','47','49','95','23','46','47','80','80','41','49','46','49','56','46','31']
a['qr'] = ['1','1','1','1','2','1','1','2','2','1','1','2','2',
'2','1','1','1','2','1','2','1','2','2','1','1','1','2','2','1','1',
'1','1','1','1','2']
a['now'] = ['0','0','0','0','0','0','0','0','0','0','0','0','1','0','0','0','0',
'0','0','0','0','0','0','0','0','0','0','0','0','0','0','1','0','0','0']

多谢各位

非常类似,您需要在groupby之前定义列,然后应用操作

假设您有实际的整数而不是字符串

import numpy as np
import pandas as pd
a.assign(q1_bad = np.where((a['qr'].eq(1) & a['now'].eq(1)),1,0),
         q2_bad = np.where((a['qr'].eq(2) & a['now'].eq(1)),1,0)

).groupby('high')[['q1_bad','q2_bad']].sum()

对于额外的where子句,您可以使用多种方法之一对其进行筛选,但为了方便起见,我们可以在末尾添加
query

a.dropna(subset='high').assign(q1_bad = np.where((a['qr'].eq(1) & a['now'].eq(1)),1,0),
         q2_bad = np.where((a['qr'].eq(2) & a['now'].eq(1)),1,0)

).groupby('high')[['q1_bad','q2_bad']].sum().query('q2_bad >= 2 and q1_bad >= 2')

这非常相似,您需要在groupby之前定义列,然后应用您的操作

假设您有实际的整数而不是字符串

import numpy as np
import pandas as pd
a.assign(q1_bad = np.where((a['qr'].eq(1) & a['now'].eq(1)),1,0),
         q2_bad = np.where((a['qr'].eq(2) & a['now'].eq(1)),1,0)

).groupby('high')[['q1_bad','q2_bad']].sum()

对于额外的where子句,您可以使用多种方法之一对其进行筛选,但为了方便起见,我们可以在末尾添加
query

a.dropna(subset='high').assign(q1_bad = np.where((a['qr'].eq(1) & a['now'].eq(1)),1,0),
         q2_bad = np.where((a['qr'].eq(2) & a['now'].eq(1)),1,0)

).groupby('high')[['q1_bad','q2_bad']].sum().query('q2_bad >= 2 and q1_bad >= 2')

为你做了一点谷歌搜索:jeffery_the_wind,非常感谢)为你做了一点谷歌搜索:jeffery_the_wind,非常感谢)Manakin,非常感谢。你的代码工作得很好。我唯一纠正的是在最后一个查询中的q2\u错误和q1\u错误。Manakin,非常感谢。你的代码工作得很好。我唯一纠正的是在最后的查询中,q1上的q2\u坏。