我有以下数据格式,并希望根据下面的函数转换数据格式的值,但我无法让它与.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.0def 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发布于 2021-12-08 19:15:30
IIUC,您可以使用transform、map和fillna的组合来创建这样的基于列的更改。
将一个函数应用到我们指定的每个columns
map中,根据dictionary
fillna为我们更改值,将处理掉的情况--在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发布于 2021-12-08 19:11:01
假设要转换的列名为"mycol",则可以显式地替换它:
newvals = [scoring(item) for item in df['mycol']]
df['mycol'] = newvals底部“返回x”。
https://stackoverflow.com/questions/70280335
复制相似问题