Skip to main content
 首页 » 编程设计

python之Pandas :根据列中的条件测试替换记录

2025年05月04日18lori

我在数据框中有唯一的记录,没有重复,这是由跨多个列的值的组合确定的:

import pandas as pd 
d = {'Alpha' : ['C', 'B', 'C','D', 'A', 'A'], 'Beta' : ['G', 'F', 'G', 'H', 'A', 'A'],'Year': ['Base', 88, 94, 22, 'Base', 66], 'Zulu' : [1, 2, -3, 4, 5, -3]} 
df = pd.DataFrame(d)    

这让我们:

  Alpha Beta  Year  Zulu 
0     C    G  Base     1 
1     B    F    88     2 
2     C    G    94    -3 
3     D    H    22     4 
4     A    A  Base     5 
5     A    A    66    -4 

索引 0 与索引 2 接近匹配,索引 4 与索引 5 接近匹配,除了索引 0 和索引 4 的 'Year' 值是 Base,而索引 2 和 5 的 'Zulu' 值是负面的。我想用索引 0 和 4 中相应的 Zulu 值替换 2 和 5 中的负“Zulu”值,而不破坏其他行。输出 df 将如下所示:

  Alpha Beta  Year  Zulu 
0     C    G  Base     1 
1     B    F    88     2 
2     C    G    94     1 
3     D    H    22     4 
4     A    A  Base     5 
5     A    A    66     5 

我可以轻松地从过滤器和深度复制开始以避免切片问题,然后备份原始数据:

df_sub = df[df.Zulu < 0].copy(deep=True) 
df_sub['Zulu_backup'] = df_sub.Zulu 

然后我可以使用 df_sub 与原始合并:

df_result = pd.merge(df_sub, df, how='right') 

导致:

Alpha Beta  Year    Zulu     Zulu_backup 
0     C    G    94    -3         -3.0 
1     A    A    66    -3         -3.0 
2     C    G  Base     1          NaN 
3     B    F    88     2          NaN 
4     D    H    22     4          NaN 
5     A    A  Base     5          NaN 

但我不知道从这里到哪里才能不弄乱数据框的其他行。我有一个相当复杂的脚本。我猜我可以创建一个系列并将其映射到数据框,但我不知道该怎么做。迭代这不是一个选项,因为我有数百万行。非常感谢任何帮助。

请您参考如下方法:

一种方法是将 Zulu 中的负值转换为 nan 然后 fillna

df.loc[df['Zulu'] < 0, 'Zulu'] = np.nan 
df['Zulu'] = df.groupby(['Alpha', 'Beta']).Zulu.apply(lambda x: x.ffill().bfill()).astype(int) 
 
 
    Alpha   Beta    Year    Zulu 
0   C       G       Base    1 
1   B       F       88      2 
2   C       G       94      1 
3   D       H       22      4 
4   A       A       Base    5 
5   A       A       66      5