看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
今天我们来完成一个特殊的求差值问题。在正常的计算了,是上下两行的值进行差值计算,但在本需求中,需要以自然月进行计算,但有些月份去没有上月数据,我们就要想办法利用 pandas 的一些技巧来实现了。
我们的数据如下,先读入 DataFrame:
import pandas as pd
import numpy as np
data_dict = {"province":['河南','河北','河南','河南','河南','河北'],
"month":['2月','1月','1月','5月','3月','2月'],
"temperature":['43','23','34','32','23','45']
}
df = pd.DataFrame(data_dict)
df
'''
province month temperature
0 河南 2月 43
1 河北 1月 23
2 河南 1月 34
3 河南 5月 32
4 河南 3月 23
5 河北 2月 45
'''
需求的逻辑是按照省份,在当月中计算出与上月的温差(即当月减去上月),可问题是在省份内,月份是不全的,如果当月没有上月数据变显示为 Nan。
由于是按省份处理,我们就按省份分组,分组后就以各省的 DataFrame 进行处理数据。
在省内,由于月份不一定全,我们先定义一个1月到12月的全年的空数据,将这个数据与现有的数据合并为一个新数据。
在以上合并过程中,空数据排除已有的月份数据,这样就得到了一个12个月的数据,当然原数据里没有的月份数据为空。
接下来,我们按月分排序未温差,监控月份没数据的,温差会计算为空。
最后将原来这空的数据删除,这样就巧妙地借没有数据的月份算出了差值。
先定义一个函数,在按省份分组后调用,用于处理并返回温差数据。
def grouped(d: pd.DataFrame):
# 一个全年的月份做基础
demo = pd.DataFrame({'month': [f'{i}月' for i in range(1,13)],
'temperature': np.nan})
return (
pd.concat([d, demo.loc[~demo.month.isin(d.month)]])
.sort_values('month')
.assign(diff=lambda d: d.temperature.diff())
.loc[lambda x: ~x.province.isna()]
)
按省份分组后调用以上函数:
# 调用
(
df.astype({'temperature': int})
.groupby('province', as_index=False)
.apply(grouped)
.sort_index(level=1)
.droplevel(0)
)
'''
province month temperature diff
0 河南 2月 43.0 9.0
1 河北 1月 23.0 NaN
2 河南 1月 34.0 NaN
3 河南 5月 32.0 NaN
4 河南 3月 23.0 -20.0
5 河北 2月 45.0 22.0
'''
以上代码中我们还做了一些数据处理工作,这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 3:56 p.m. 标签:pandas python 差值