首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫按条件分类

大熊猫按条件分类
EN

Stack Overflow用户
提问于 2021-12-08 18:56:37
回答 2查看 43关注 0票数 0

我有以下数据格式,并希望根据下面的函数转换数据格式的值,但我无法让它与.transform.apply一起工作。

代码语言:javascript
复制
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
代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-08 19:15:30

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

将一个函数应用到我们指定的每个columns

  • map中,根据dictionary

  • fillna为我们更改值,将处理掉的情况--在map字典中没有的任何内容都将被替换--这个值为

代码语言:javascript
复制
# 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,如下所示:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-12-08 19:11:01

假设要转换的列名为"mycol",则可以显式地替换它:

代码语言:javascript
复制
newvals = [scoring(item) for item in df['mycol']]
df['mycol'] = newvals

  • 还注意到评分函数需要在

底部“返回x”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70280335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档