熊猫:比较组中的所有行,并检查条件是否满足

时间:2020-04-01 03:29:11

标签: python pandas

我正在尝试比较组中的所有行,以检查条件是否得到满足。如果不满足条件,则将新列设置为True,否则设置为False。我遇到的问题是找到一种巧妙的方法来比较每个组中的所有行。我有一些有效的方法,但是在组中有很多行的情况下将不起作用。

for i in range(8):
    n = -i-1
    cond=(((df['age']-df['age'].shift(n))*(df['weight']-df['weight'].shift(n)))<0)&(df['ref']==df['ref'].shift(n))&(df['age']<7)&(df['age'].shift(n)<7)
    df['x'+i] = cond.groupby(df['ref']).transform('any')
df.loc[:,'WFA'] = 0
df.loc[(df['x0']==False)&(df['x1']==False)&(df['x2']==False)&(df['x3']==False)&(df['x4']==False)&(df['x5']==False)&(df['x6']==False)&(df['x7']==False),'WFA'] = 1

要遍历每一行,我创建了一个循环,用于比较相邻行(使用shift)。每个循环代表下一个相邻的行。实际上,我能够比较组中的所有行,其中组中的行数为8或更少。您可以想象,随着行数的增加,它变得非常麻烦。

我想查看是否有任何行与任何其他行匹配该条件,而不是为每个班次创建列。然后将新列“ WFA”设置为True或False。

1 个答案:

答案 0 :(得分:0)

如果有人感兴趣,我会在这里发布我自己问题的答案(尽管很慢):

df.loc[:,'WFA'] = 0
for ref, gref in df.groupby('ref'):
    count=0
    for r_idx, row in gref.iterrows():
        cond = ((((row['age']-gref.loc[gref['age']<7, 'age'])*(row['weight']-gref.loc[gref['age']<7, 'weight']))<0).any())&(row['age']<7)
        if cond==False:
            count+=1
    if count==len(gref):
        df.loc[df['ref']==ref, 'WFA'] = 1