Pandas Dataframe 根据条件变换

Pandas Dataframe fransform according to condition

我有以下数据框,想根据下面的函数转换数据框的值,但我无法使用 .transform.apply

dgp_id        8    13
lasso_class  4.0  2.0
lasso_reg    3.0  1.0
rf_class     1.0  4.0
rf_reg       2.0  3.0
xgb_class    6.0  6.0
xgb_reg      5.0  5.0
def scoring(x):
    if x == 1.0:
        x = 1
    elif x == 2.0:
        x=1/2
    elif x == 5.0:
        x=-1/2
    elif x==6.0:
        x=-1
    else:
        x=0

假设您要转换的列名称为“mycol”,您可以显式替换它:

newvals = [scoring(item) for item in df['mycol']]
df['mycol'] = newvals
  • 另请注意,您的评分函数底部需要“return x”

IIUC,您可以结合使用 transformmapfillna 来创建像这样的基于列的更改。

  1. transform 将对我们指定的每个列应用一个函数
  2. map会根据字典给我们改值
  3. fillna 将处理 fallthrough 情况 - map 字典中没有的任何内容都将被替换为该值
# create a mapping of old values to new values
scoring = {1.0: 1, 2.0: 1/2, 5.0: -1/2, 6.0: -1}

new_df = (
    df.filter(["8", "13"]) # select columns to score
    .transform(lambda column: column.map(scoring)) # convert values
    .fillna(0)             # fill in fallthrough cases
)

print(new_df)
     8   13
0  0.0  0.5
1  0.0  1.0
2  1.0  0.0
3  0.5  0.0
4 -1.0 -1.0
5 -0.5 -0.5

如果你想将其与原始数据结合起来,你可以像这样使用 .join


full_df = df.join(new_df, rsuffix="_scored")

print(full_df)
        dgp_id    8   13  8_scored  13_scored
0  lasso_class  4.0  2.0       0.0        0.5
1    lasso_reg  3.0  1.0       0.0        1.0
2     rf_class  1.0  4.0       1.0        0.0
3       rf_reg  2.0  3.0       0.5        0.0
4    xgb_class  6.0  6.0      -1.0       -1.0
5      xgb_reg  5.0  5.0      -0.5       -0.5