DataFrame分组迭代

3
       A   B  C  
0    Bob  10  2
1    Bob  11  8
2  Sarah  23 -2
3  Sarah  24  4
4   Jack  19 -4
5   Jack  21 -1

我想要得到一个新的df["Point"],如下所示:

  • 对于“Bob”组:df["Point"]B值C值的乘积。10*2=20; 10*8=80。
  • 对于“Sarah”组:df["Point"]B值C值的乘积。23*(-2)=(-46); 23*4=92。
  • 对于“Jack”组:df["Point"]B值C值的乘积。19*(-4)=(-76); 19*(-1)=(-19)。

我的意思是,我想要得到:

       A   B  C  Point
0    Bob  10  2     20
1    Bob  11  8     80
2  Sarah  23 -2    -46
3  Sarah  24  4     92
4   Jack  19 -4    -76
5   Jack  21 -1    -19

在此之后,我想进行以下迭代:

results = {}

grouped = df.groupby("A")

for idx, group in grouped:
    if (group["Point"] > 50).any():
        results[idx] = group[group["Point"] > 50].head(1)
        print ("")
    else:
        results[idx] = group.tail(1)
        print ("")
    print(results[idx])

并获得这个结果

      A   B  C  Point
1   Bob  11  8     80

      A   B  C  Point
3 Sarah  23  4     92

      A   B  C  Point
5  Jack  21 -1    -19

我想我需要进行双重迭代,但我不知道如何实现,或者是否有其他不同的方法。


为什么第二个“Sarah”组要乘以第二个值? - jezrael
好的。我已经编辑过了。我认为对我来说使用第一个Sarah值是正确的。 - Tie_24
1个回答

3

首先使用transformfirst创建一个新列,然后乘以C列:

df['point'] = df.groupby('A')['B'].transform('first').mul(df['C'])
print (df)
       A   B  C  point
0    Bob  10  2     20
1    Bob  11  8     80
2  Sarah  23 -2    -46
3  Sarah  24  4     92
4   Jack  19 -4    -76
5   Jack  21 -1    -19

首先按条件过滤所有行,并通过 drop_duplicates 函数获取第一行 - 默认情况下,keep='first':

df1 = df[df['point'] > 50].drop_duplicates('A')
print (df1)
       A   B  C  point
1    Bob  11  8     80
3  Sarah  24  4     92

然后通过使用 isin 过滤掉不在 df1.A 列中的行,并通过反转条件使用 ~,再次使用 drop_duplicates 仅保留最后一行:

df2 = df[~df['A'].isin(df1['A'])].drop_duplicates('A', keep='last')
print (df2)
      A   B  C  point
5  Jack  21 -1    -19

最后使用 concatdict comprehension 来创建最终的 dictionary

d = {k: v for k, v in pd.concat([df1, df2]).groupby('A')}
print (d)
{'Bob':      A   B  C  point
1  Bob  11  8     80, 'Jack':       A   B  C  point
5  Jack  21 -1    -19, 'Sarah':        A   B  C  point
3  Sarah  24  4     92}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接