看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注: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 数据。
我们就完成了需求。
(完)
更新时间:2024-12-01 17:33:46 标签:pandas python 重复值