看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在Excel中有类似以下一些数据,由分组和数字两列组成,现在需要把在同一个分组中有相反数(数字相同符号不同)的数据筛选出来。
'''
分组 数字
A1 12
A1 -12
A1 7
B2 8
B2 10
B2 -8
B2 -6
C3 5
C3 3
C3 14
D4 -5
D4 11
D4 11
'''
首先能想到的是先对数据分组,分组后本组的数据组成一个列表,我们将这个本组数据作为辅助列,放在对应分组:
df = pd.read_excel('003-分组内相反数.xlsx')
# 增加辅助列,对应本组的所有数字列表
df.assign(grp=df.分组.apply(lambda x: df.groupby('分组').get_group(x).数字.to_list()))
'''
分组 数字 grp
0 A1 12 [12, -12, 7]
1 A1 -12 [12, -12, 7]
2 A1 7 [12, -12, 7]
3 B2 8 [8, 10, -8, -6]
4 B2 10 [8, 10, -8, -6]
5 B2 -8 [8, 10, -8, -6]
6 B2 -6 [8, 10, -8, -6]
7 C3 5 [5, 3, 14]
8 C3 3 [5, 3, 14]
9 C3 14 [5, 3, 14]
10 D4 -5 [-5, 11, 11]
11 D4 11 [-5, 11, 11]
12 D4 11 [-5, 11, 11]
'''
接下来,再增加一个辅助列,判断grp列中列表内有无相反数,相反数据可以用Numpy的np.negative()计算得出:
df = pd.read_excel('003-分组内相反数.xlsx')
(
df.assign(grp=df.分组.apply(lambda x: df.groupby('分组').get_group(x).数字.to_list()))
.assign(negative=lambda y: y.apply(lambda x: np.negative(x.数字) in x.grp, axis=1))
)
'''
分组 数字 grp negative
0 A1 12 [12, -12, 7] True
1 A1 -12 [12, -12, 7] True
2 A1 7 [12, -12, 7] False
3 B2 8 [8, 10, -8, -6] True
4 B2 10 [8, 10, -8, -6] False
5 B2 -8 [8, 10, -8, -6] True
6 B2 -6 [8, 10, -8, -6] False
7 C3 5 [5, 3, 14] False
8 C3 3 [5, 3, 14] False
9 C3 14 [5, 3, 14] False
10 D4 -5 [-5, 11, 11] False
11 D4 11 [-5, 11, 11] False
12 D4 11 [-5, 11, 11] False
'''
True表示有相反数,再筛选出为True的行便可得到最终结果:
df = pd.read_excel('003-分组内相反数.xlsx')
(
df.assign(grp=df.分组.apply(lambda x: df.groupby('分组').get_group(x).数字.to_list()))
.assign(negative=lambda y: y.apply(lambda x: np.negative(x.数字) in x.grp, axis=1))
.query('negative == True')
)
'''
分组 数字 grp negative
0 A1 12 [12, -12, 7] True
1 A1 -12 [12, -12, 7] True
3 B2 8 [8, 10, -8, -6] True
5 B2 -8 [8, 10, -8, -6] True
'''
更新时间:Aug. 18, 2024, 3:41 p.m. 标签:pandas python 相反数