Pandas 数据帧值和行条件都取决于其他列

Pandas dataframe values and row condition both depend on other columns

我有一个 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,但如果 col1 中的值不是 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 而未更新示例中的值。

使用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

np.where 完成任务:

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

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

获得

  col1       col2  col3
0    a    1.00000    11
1    a    2.00000    12
2    b  261.11198    13
3    b  764.37410    14
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