【问题标题】:Pandas dataframe values and row condition both depend on other columnsPandas 数据框值和行条件都依赖于其他列
【发布时间】:2025-11-23 08:55:01
【问题描述】:

我有一个 Pandas 数据框:

import pandas as pd

df = pd.DataFrame({'col1': ['a','a','b','b'],
                   'col2': [1,2,3,4],
                   'col3': [11,12,13,14]})
  col1 col2 col3
0   a   1   11
1   a   2   12
2   b   3   13
3   b   4   14

如果col1 中的值是b,我需要将col2 中的条目替换为行的col2col3 值的某个函数,但如果@ 中的值保持不变,则保持行不变987654327@ 不是b。假设函数是col3 * exp(col2),然后将其应用于上面的df 将产生

    col1   col2   col3
0   a      1      11
1   a      2      12
2   b      261.1  13
3   b      764.4  14

理想情况下,这将被矢量化并就地进行,因为我的真实 DataFrame 有几百万行。

这与 Stack Overflow 上的其他问题不同,因为它们只需要新值不依赖于其他列或一次更改所有行。谢谢。

编辑:更正了目标 DataFrame。已将函数从 exp(col2)+col3 更改为 exp(col2)*col3 而不更新示例中的值。

【问题讨论】:

    标签: python pandas dataframe numpy slice


    【解决方案1】:

    使用DataFrame.iloc

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'col1': ['a', 'a', 'b', 'b'], 'col2': [1, 2, 3, 4], 'col3': [11, 12, 13, 14]})
    
    df.loc[df['col1'] == 'b', 'col2'] = df['col3'] * np.exp(df['col2'])
    print(df)
    

    给出正确的

      col1       col2  col3
    0    a    1.00000    11
    1    a    2.00000    12
    2    b  261.11198    13
    3    b  764.37410    14
    

    【讨论】:

    • 谢谢!目标 DataFrame 中的值已更正。已将函数从 exp(col2)+col3 更改为 exp(col2)*col3 而不更新示例中的值。
    【解决方案2】:

    np.where 完成这项工作:

    df.col2 = np.where(df.col1 == "b", df.col3 * np.exp(df.col2), df.col2)
    

    它说“对于每一行:如果dfcol1 中有'b',则取第二个参数的值(这是col2col3 的函数);如果没有,则取第三个参数的值(它是col2,所以它保持原样)。”。以矢量化方式将其应用于每一行。

    得到

      col1       col2  col3
    0    a    1.00000    11
    1    a    2.00000    12
    2    b  261.11198    13
    3    b  764.37410    14
    

    【讨论】:

    • 谢谢! np.where 比 pd.loc 快吗?
    • 在 10**7 行上快速进行基准测试:np.where 耗时 1.66 秒,dp.loc 耗时 2.42 秒,非常相似,但接受了 np.where 更快的答案。
    • @Connor_Tracy 很高兴能帮上忙!是的,通常在 numpy 域中可能会有一些加速,但在这种情况下不会那么多。
    【解决方案3】:
    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame({'col1': ['a','a','b','b'],
                       'col2': [1,2,3,4],
                       'col3': [11,12,13,14]})
    
    def get_exp(col1, col2, col3):
        if col1 == 'b':
            return (col3 * np.exp(col2))
        return col2    
    
    
    df.col2 = df.apply(lambda x: get_exp(x.col1, x.col2, x.col3), axis=1)
    print(df)
    

    输出:

        col1    col2    col3
    0   a   1.00000     11
    1   a   2.00000     12
    2   b   261.11198   13
    3   b   764.37410   14
    

    【讨论】: