Python Pandas:Groupby和使用组内的条件进行迭代?

Python Pandas:Groupby和使用组内的条件进行迭代?,python,pandas,loops,group-by,Python,Pandas,Loops,Group By,我有一个相对棘手的迭代问题,我在实现上遇到了困难 我有一个dataframe,其前6列如下所示。我正在尝试编写一个函数,该函数在组中进行迭代(具体地说是按类别和级别对行进行分组),然后在该行与组中的任何其他行满足两个条件时生成一个新变量。我想创造机会?下面的二进制指示符,如果符合条件,则等于1。“原因”列只是对我要生成的结果进行了解释 逻辑:对于每个id组,如果((度量值LHS[实体]>度量值RHS[组中的其他实体])和(度量值LHS[实体]>基线[实体]),机会?=一, 在我的例子中,机会是什

我有一个相对棘手的迭代问题,我在实现上遇到了困难

我有一个dataframe,其前6列如下所示。我正在尝试编写一个函数,该函数在组中进行迭代(具体地说是按类别和级别对行进行分组),然后在该行与组中的任何其他行满足两个条件时生成一个新变量。我想创造机会?下面的二进制指示符,如果符合条件,则等于1。“原因”列只是对我要生成的结果进行了解释

逻辑:对于每个id组,如果((度量值LHS[实体]>度量值RHS[组中的其他实体])和(度量值LHS[实体]>基线[实体]),机会?=一,

在我的例子中,机会是什么?Jim的列等于1,因为Metric_LHS(Jim)>Metric_RHS(Jack)和Metric_LHS(Jim)>Baseline(Jim)。同时,例如,Rick是0,因为该标准不适用于组中唯一的其他人Joe

下面是我编写的一些代码和逻辑。我的问题是:如何在每个组的每一行中进行迭代,并将该行与该组中的每一行进行比较

id_group=df.groupby(['Category','Level'])
    for row in id_group:
       df['Opportunity?'](([df[metric_LHS][row]>df[Metric_RHS][row+1]) &\
       (df[metric_LHS][row]>df[Baseline][row])) = 1  
***How to iterate to next row in group?***

以这种方式在groupby对象上迭代时,返回的对象将是一个元组(
索引

要迭代每个
组的行,可以使用

大概是这样的:

id_group=df.groupby(['Category','Level'])

for g_idx, group in id_group:
    for r_idx, row in group.iterrows():
        if (((row['Metric_LHS'] > group['Metric_RHS']).any())
             & (row['Metric_LHS'] > row['Baseline'])):
            df.loc[r_idx, 'Opportunity?'] = 1
使用您提供的玩具数据的工作示例
这太棒了,非常感谢。如果你不介意进一步教育我,你能解释一下为什么在If语句中删除这些组吗?那部分对我来说很不直观me@Z_D没问题。当我意识到这完全是多余的时候,我实际上正在为这一步做一个解释!基本上,我是将当前
迭代与当前
迭代中的每一行进行比较,因此将其从组中删除。但这仅在逻辑为LHS
=
RHS时才有必要。这意味着该行将与其自身进行比较,但这并不重要,因为它并不“大于”自身。我会把它从答案中删除好的,明白了。非常感谢你!
df = pd.DataFrame({'Name':['Jim', 'Jack', 'Greg', 'Alex', 'Steve', 'Jack', 'Rick', 'Joe', 'Bill', 'Dave', 'Dan'],
        'Category':['South']*3 + ['North']*3 + ['West']*3 + ['East']*2,
        'Level': [1,1,2,2.5,2.5,2.5,3,3,3.25,4,4],
        'Metric_LHS': [100,80,70,110,90,105,110,111,90,87,83],
        'Metric_RHS': [120,90,75,115,95,110,112,113,95,90,85],
        'Baseline': [95,np.nan,73,112,85,103,105,112,93,75,81],
        'Opportunity?': [np.nan]*11})


id_group=df.groupby(['Category','Level'])

for g_idx, group in id_group:
    for r_idx, row in group.iterrows():
        if (((row['Metric_LHS'] > group['Metric_RHS']).any())
             & (row['Metric_LHS'] > row['Baseline'])):
            df.loc[r_idx, 'Opportunity?'] = 1


print(df)

     Name Category  Level  Metric_LHS  Metric_RHS  Baseline  Opportunity?
0     Jim    South   1.00         100         120      95.0           1.0
1    Jack    South   1.00          80          90       NaN           NaN
2    Greg    South   2.00          70          75      73.0           NaN
3    Alex    North   2.50         110         115     112.0           NaN
4   Steve    North   2.50          90          95      85.0           NaN
5    Jack    North   2.50         105         110     103.0           1.0
6    Rick     West   3.00         110         112     105.0           NaN
7     Joe     West   3.00         111         113     112.0           NaN
8    Bill     West   3.25          90          95      93.0           NaN
9    Dave     East   4.00          87          90      75.0           1.0
10    Dan     East   4.00          83          85      81.0           NaN