替换列表/数据框中项目的更好方法

2024-09-28 01:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须手动更正一些数据,否则可能会误导模型。你知道吗

逻辑是:

    if col("a") not empty & col("b") negative 
    => create col("ret_a") = 2*min(col("a")) - col("a")
    else col("ret_a") = col("a")

我正在使用的代码是:

# a
df["ret_a"] = np.where(
    np.logical_and(pd.notnull(df["a"]), df["b"] < 0),
    2*df["a"].min()- df["a"],
    df["a"])

问题是我有很多条件。。。我认为像“<;0”这样的条件不能存储在dict{}中使用局部放电图()

然后我试着用以下方法构建一些东西:

df['i'] = np.select(conditions, choices,)

使用“i”“条件”和“选项”:

i= [
    'RETURN_COM_EQY_',                     # a
    'INTEREST_COVERAGE_RATIO_',            # b
    'TOT_DEBT_TO_TOT_CAP_',                # c
    'TOT_DEBT_TO_TOT_EQY_',                # d
    'NET_DEBT_TO_EBITDA_',                 # e
    'NET_INTEREST_COVERAGE_']              # f

conditions = [
    (df['TOTAL_EQUITY_'] < 0),            # a
    (df['IS_INT_EXPENSE_'] < 0),          # b
    (df['NET_DEBT_'] < 0),                # c
    (df['NET_DEBT_'] < 0),                # d
    (df['NET_DEBT_'] < 0),                # e1
    (df['EBIT_'] < 0),                    # e2
    (df['IS_INT_EXPENSE_'] < 0)]          # f

choices = [
    2*df["RETURN_COM_EQY_"].min() - df["RETURN_COM_EQY_"],                         # a
    2*df["INTEREST_COVERAGE_RATIO_"].min() - df["INTEREST_COVERAGE_RATIO_"],       # b
    2*df["TOT_DEBT_TO_TOT_CAP_"].max() - df["TOT_DEBT_TO_TOT_CAP_"],               # c
    2*df["TOT_DEBT_TO_TOT_EQY_"].max() - df["TOT_DEBT_TO_TOT_EQY_"],               # d
    2*df["NET_DEBT_TO_EBITDA_"].max() - df["NET_DEBT_TO_EBITDA_"],                 # e1
    2*df["NET_DEBT_TO_EBITDA_"].min() - df["NET_DEBT_TO_EBITDA_"],                 # e2
    2*df["NET_INTEREST_COVERAGE_"].min() - df["NET_INTEREST_COVERAGE_"],           # f
    ]

该操作的完整代码为:

    # a
df["ret_mean_RETURN_COM_EQY_"] = np.where(
    np.logical_and(pd.notnull(df["mean_RETURN_COM_EQY_"]),
                   df["mean_TOTAL_EQUITY_"] < 0),
    2*df["mean_RETURN_COM_EQY_"].min() 
    - df["mean_RETURN_COM_EQY_"],
                   df["mean_RETURN_COM_EQY_"])

# b
df["ret_mean_INTEREST_COVERAGE_RATIO_"] = np.where(
    np.logical_and(pd.notnull(df["mean_INTEREST_COVERAGE_RATIO_"]),
                   df["mean_IS_INT_EXPENSE_"] < 0),
    2*df["mean_INTEREST_COVERAGE_RATIO_"].min() 
    - df["mean_INTEREST_COVERAGE_RATIO_"],
                   df["mean_INTEREST_COVERAGE_RATIO_"])
# c
df["ret_mean_TOT_DEBT_TO_TOT_CAP_"] = np.where(
    np.logical_and(pd.notnull(df["mean_TOT_DEBT_TO_TOT_CAP_"]),
                   df["mean_NET_DEBT_"] < 0),
    2*df["mean_TOT_DEBT_TO_TOT_CAP_"].max()
    - df["mean_TOT_DEBT_TO_TOT_CAP_"],
                   df["mean_TOT_DEBT_TO_TOT_CAP_"])

# d
df["ret_mean_TOT_DEBT_TO_TOT_EQY_"] = np.where(
    np.logical_and(pd.notnull(df["mean_TOT_DEBT_TO_TOT_EQY_"]),
                   df["mean_NET_DEBT_"] < 0),
    2*df["mean_TOT_DEBT_TO_TOT_EQY_"].max()
    - df["mean_TOT_DEBT_TO_TOT_EQY_"],
                   df["mean_TOT_DEBT_TO_TOT_EQY_"])

# e1
df["ret_mean_NET_DEBT_TO_EBITDA_"] = np.where(
    np.logical_and(pd.notnull(df["mean_NET_DEBT_TO_EBITDA_"]),
                   df["mean_NET_DEBT_"] < 0),
    2*df["mean_NET_DEBT_TO_EBITDA_"].max()
    - df["mean_NET_DEBT_TO_EBITDA_"],
                   df["mean_NET_DEBT_TO_EBITDA_"])

# e2
df["ret_mean_NET_DEBT_TO_EBITDA_"] = np.where(
    np.logical_and(pd.notnull(df["mean_NET_DEBT_TO_EBITDA_"]),
                   df["mean_EBIT_"] < 0),
    2*df["mean_NET_DEBT_TO_EBITDA_"].min()
    - df["mean_NET_DEBT_TO_EBITDA_"],
                   df["ret_mean_NET_DEBT_TO_EBITDA_"]) # different here

# f
df["ret_mean_NET_INTEREST_COVERAGE_"] = np.where(
    np.logical_and(pd.notnull(df["mean_NET_INTEREST_COVERAGE_"]),
                   df["mean_IS_INT_EXPENSE_"] < 0),
    2*df["mean_NET_INTEREST_COVERAGE_"].min()
    - df["mean_NET_INTEREST_COVERAGE_"],
                   df["mean_NET_INTEREST_COVERAGE_"])

Tags: todfnetnpcoverageminmeanwhere
1条回答
网友
1楼 · 发布于 2024-09-28 01:33:30

此功能应完成以下工作:

def func(df, i_n, condition, choice):
   name = "ret_" + i_n
   df[name] = df[i_n]
   df.loc[(pd.notnull(df[i_n])) & (condition), name] = choice

for i_n, condition, choice in zip(i, conditions, choices):
   func(df, i_n, condition, choice)

相关问题 更多 >

    热门问题