看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例将利用 pandas 在原数据中新增加一列,这列除第一个值取期中一列的本行值,其他值取新列的上一行值与另一列当前值的和。这是一个典型的数据填充问题,我们依然推荐使用 assign()
来指定并计算新列。
我们来生成数据:
import pandas as pd
import numpy as np
import random
random.seed(666)
rng = range(100, 1100, 100)
data = {
'A': [round(random.random(), 2) for i in rng],
'B': rng
}
df = pd.DataFrame(data)
df
'''
A B
0 0.46 100
1 0.90 200
2 0.43 300
3 0.50 400
4 0.81 500
5 0.55 600
6 0.71 700
7 0.12 800
8 0.81 900
9 0.39 1000
'''
我们生成的数据有两列,现在需要增加一个新列 C 列。C 列的索引 0 取 B 列的对应值,其他值取 C 列自己上一个值与对应 A 列值的和。举例 C 列值为:
以上是新列的取值逻辑。
我们用 assign()
来指定新列,先处理第一个值的特殊逻辑,如果索引为 0 就取 B 列的值,如果不是就取 A 列的值,然后将 C 列累加就实现了需求。
先增加 C 列并赋值:
df.assign(C=np.where(df.index==0, df.B, df.A))
df.assign(C=df.B.where(df.index==0, df.A)) # 同上
'''
A B C
0 0.46 100 100.00
1 0.90 200 0.90
2 0.43 300 0.43
3 0.50 400 0.50
4 0.81 500 0.81
5 0.55 600 0.55
6 0.71 700 0.71
7 0.12 800 0.12
8 0.81 900 0.81
9 0.39 1000 0.39
'''
再用 assign()
对 C 列进行累加,覆盖原值:
(
df.assign(C=np.where(df.index==0, df.B, df.A))
.assign(C=lambda d: d.C.cumsum())
)
'''
A B C
0 0.46 100 100.00
1 0.90 200 100.90
2 0.43 300 101.33
3 0.50 400 101.83
4 0.81 500 102.64
5 0.55 600 103.19
6 0.71 700 103.90
7 0.12 800 104.02
8 0.81 900 104.83
9 0.39 1000 105.22
'''
上述代码 C 列由于 df 本身没有,就需要用 lambda 来调用上行代码增加 C 后的 DataFrame 数据。
我们就完成了需求。
(完)
更新时间:Aug. 18, 2024, 3:55 p.m. 标签:pandas python 重复值