看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在一个数据表中,如果想要对满足一定取值规则的行进行标记,pandas 也能非常方便地实现解决,本案例求我们就来完成这样的一个常见的需求。这个问题来自于知乎。
原数据如下:
dct = {
'A': [7, 8, 1, 10, 4, 7, 10],
'B': [4, 2, 6, 5, 3, 10, 6],
'C': [6, 1, 10, 4, 2, 7, 6],
'D': [4, 1, 8, 6, 4, 10, 10],
'E': [5, 5, 8, 2, 1, 10, 9],
'F': [4, 2, 6, 9, 9, 1, 9],
'G': [5, 4, 1, 8, 6, 9, 1]
}
df = pd.DataFrame(dct)
df
'''
A B C D E F G
0 7 4 6 4 5 4 5
1 8 2 1 1 5 2 4
2 1 6 10 8 8 6 1
3 10 5 4 6 2 9 8
4 4 3 2 4 1 9 6
5 7 10 7 10 10 1 9
6 10 6 6 10 9 9 1
'''
需求为增加一列,标记该行如果包含 4 或者 5 为 True,否则为 False。
先判断 DataFrame 上每个值是否为 4 或者 5,得到一个布尔值 DataFrame,满足条件的位置为 True。
然后再判断整行是否有 True,得到一个布尔序列,最后将这个布尔序列增加为一个新列。
根据思路编写代码过程如下。先判断所有值是否为 4 或者 5:
df.isin([4, 5])
'''
A B C D E F G
0 False True False True True True True
1 False False False False True False True
2 False False False False False False False
3 False True True False False False False
4 True False False True False False False
5 False False False False False False False
6 False False False False False False False
'''
结果得到一个布尔矩阵,对应位置为 4 或者 5 时为 True。再用 any() 按行判断是否有 True 值,有则为本行整体为 True:
df.isin([4, 5]).any(axis=1)
'''
0 True
1 True
2 False
3 True
4 True
5 False
6 False
dtype: bool
'''
最后将得到的这个序列指定为一个名为 tag 的新列:
df.assign(tag=df.isin([4, 5]).any(1))
'''
A B C D E F G tag
0 7 4 6 4 5 4 5 True
1 8 2 1 1 5 2 4 True
2 1 6 10 8 8 6 1 False
3 10 5 4 6 2 9 8 True
4 4 3 2 4 1 9 6 True
5 7 10 7 10 10 1 9 False
6 10 6 6 10 9 9 1 False
'''
以上就是最终的代码,我们完成了需求。
(完)
更新时间:Aug. 18, 2024, 3:56 p.m. 标签:pandas python 标记