微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-遍历dataframe groupby

       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”],如下所示:

>对于“鲍勃”组:df [“点”]是第一个B值与C值的乘积. 10 * 2 = 20; 10 * 8 = 80.
>对于“ Sarah”组:df [“ Point”]是第一个B值与C值的乘积. 23 *(-2)=(-46); 23 * 4 = 92.
>对于“杰克”组:df [“点”]是第一个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

我想我必须进行两次迭代,但是我不知道该怎么做,或者是否可能以其他方式进行.

解决方法:

首先用transform创建新列,其中第一个创建多个列,然后按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

最后一次将concat与dict理解一起用于最终字典:

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}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐