根据数据框包含的字母过滤数据框

时间:2021-06-07 16:38:27

标签: python pandas dataframe

我有一个数据框:

  Model         A    C
  Neg Exp       3    2
  Power Model   2    1
  Log           2    7

我想根据模型列对这些执行一些方程。

如果Model列包含exp,执行A+C 如果 Model 列包含 pow,则执行 A*C 如果模型列包含,记录,执行 A-C

预期输出

  Model         A    C   Result
  Neg Exp       3    2     5
  Power Model   2    1     2
  Log           2    7    -5

2 个答案:

答案 0 :(得分:1)

尝试使用 containsnp.select

import re
c1 = df.Model.str.contains('exp',flags = re.IGNORECASE)
c2 = df.Model.str.contains('pow',flags = re.IGNORECASE)
c3 = df.Model.str.contains('log',flags = re.IGNORECASE)
df['new'] = np.select([c1,c2,c3], [df.eval('A+C'),df.eval('A*C'),df.eval('A-C')])
df
Out[186]: 
        Model  A  C  new
0      NegExp  3  2    5
1  PowerModel  2  1    2
2         Log  2  7   -5

答案 1 :(得分:0)

使用 df.apply(..., axis=1) 函数,您可以将整行移交给定义的函数并计算所需的输出。尽管不如其他解决方案优雅,但我认为它更具可扩展性。

data = [{"Model":"Neg Exp","A": 3,"C": 2},
  {"Model":"Power Model","A": 2,"C": 1},
  {"Model":"Log","A": 2,"C": 7}]

import pandas as pd

df = pd.DataFrame(data)

def conditional_apply(row):
    if row["Model"].lower().find("exp") >= 0:
        return row["A"]+ row["C"]
    elif row["Model"].lower().find("pow") >= 0:
        return row["A"]* row["C"]
    elif row["Model"].lower().find("log") >= 0:
        return row["A"]- row["C"]
    
df["Result"] = df.apply(lambda row: conditional_apply(row), axis=1)

结果:

df
Out[87]: 
         Model  A  C  Result
0      Neg Exp  3  2       5
1  Power Model  2  1       2
2          Log  2  7      -5

编辑: conditional_apply

的一些清理
def conditional_apply(row):
    model, A, C = row["Model"].lower(), row["A"], row["C"]
    if model.find("exp") >= 0:
        return A+ C
    elif model.find("pow") >= 0:
        return A* C
    elif model.find("log") >= 0:
        return A- C