看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在 pandas 中,向量化计算是指利用 pandas 对象的内置方法和函数,将操作应用到整个数据结构的每个元素,从而在单个操作中完成大量的计算。但在一些需求中,我们无法使用向量化计算,就需要迭代操作,本例就是这样的一种情况。
假如有以下数据:
import pandas as pd
df = pd.DataFrame({'a': [5, 6, 7], 'b': [3, 5, 8]})
df
'''
a b
0 5 3
1 6 5
2 7 8
'''
根据以上数据,需要增加一列 c,c 列的计算逻辑是:
本例不是一个向量化的计算,因为第一行的计算逻辑与其他行的计算逻辑不同。针对,这样的情况,我们可以用迭代的方法进行灵活的操作。
先根据第一行的计算逻辑增加 c 列,然后迭代并排除第一行,对其他行按计算逻辑进行修改。
按第一行的计算逻辑增加 c 列:
df['c'] = df.a+df.b
df
'''
a b c
0 5 3 8
1 6 5 11
2 7 8 15
'''
迭代计算修改其他行:
for i in df.itertuples():
if i.Index != 0:
df.loc[i.Index, 'c'] = i.a + df.loc[i.Index-1, 'c']
以上代码,df.itertuples() 产生一个可迭代 map 对象,每行是一个 namedtuple 类型数据。即:
for i in df.itertuples():
print(i)
'''
Pandas(Index=0, a=5, b=3, c=8)
Pandas(Index=1, a=6, b=5, c=11)
Pandas(Index=2, a=7, b=8, c=15)
'''
接着判断如果索引不是第一行(值为 0)就用 loc 获取定位并进行修改,最后得到的数据为:
df
'''
a b c
0 5 3 8
1 6 5 14
2 7 8 21
'''
这样就得到了最终的数据结果。
(完)
更新时间:Aug. 18, 2024, 4:12 p.m. 标签:pandas python 向量化