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 举报,一经查实,本站将立刻删除。