看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例是我们在日常统计中,按照一定范围进行数值计算的典型场景。有时我们不需要将一行或者一列的所有数据进行统计,而是在限制的一个固定的范围内,我们来看看 pandas 对于此类需求是如何完成的。
我们构造一些数据:
import pandas as pd
import random
r = range(20)
random.seed(111)
df = pd.DataFrame({'a': random.choices(r, k=6),
'b': random.choices(r, k=6)},
index=[f'col_{i}' for i in range(1, 7)]
).T
df
'''
col_1 col_2 col_3 col_4 col_5 col_6
a 16 4 18 9 7 12
b 3 3 8 4 13 8
'''
这个数据有 a、b 两行,有后缀从 1-6 的六列,同时有以下字典:
max_scope = {'a': [1, 2, 4], 'b': [3, 2, 6]}
max_scope
# {'a': [1, 2, 4], 'b': [3, 2, 6]}
这个字典限定了我们每行要计算的列后缀范围,需要计算这些范围的最大值,在原数据上增加这些范围的最大值数字,同时标明范围。最终结果即:
'''
col_1 col_2 col_3 col_4 col_5 col_6 scope _max
a 16 4 18 9 7 12 [1, 2, 4] 16
b 3 3 8 4 13 8 [3, 2, 6] 8
'''
由于范围与列名关联,我们需要先将列转换为后缀数字用于计算,接着用 apply()
按行取范围数据再求得最终的最大值。
修改列名值:
df.rename(columns=lambda x: int(x.replace('col_', '')))
'''
1 2 3 4 5 6
a 16 4 18 9 7 12
b 3 3 8 4 13 8
'''
再按行取范围的最大值:
col = (
df.rename(columns=lambda x: int(x.replace('col_', '')))
.apply(lambda x: x.loc[max_scope[x.name]].max(), axis=1)
)
col
'''
a 16
b 8
dtype: int64
'''
最后将这个结果增加到新列中:
df.assign(scope=max_scope.values(), _max=col)
'''
col_1 col_2 col_3 col_4 col_5 col_6 scope _max
a 16 4 18 9 7 12 [1, 2, 4] 16
b 3 3 8 4 13 8 [3, 2, 6] 8
'''
这样我们就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:22 p.m. 标签:pandas python 最大值