为了账号安全,请及时绑定邮箱和手机立即绑定

为什么使用 qcut 后我的数据值被替换为“NaN”?

为什么使用 qcut 后我的数据值被替换为“NaN”?

慕的地10843 2023-08-15 17:17:26
我正在使用 9000 行和 6 列的 pandas 数据框。此时,我正在尝试将 4 种工作(商业经理 - 业务开发人员 -网络营销人员 - 流量经理)。鉴于每个工作的年经验范围并不相同,我使用“qcut”将数据分为四组,如下所示:(您可以运行下面的代码来获取数据框示例)import pandas as pddf = pd.DataFrame({'Job': ['Commercial Manager', 'Traffic Manager', 'Web Marketer', 'Commercial Manager', 'Commercial Manager', 'Web Marketer', 'Commercial Manager', 'Commercial Manager', 'Traffic Manager', 'Business Developer', 'Business Developer', 'Web Marketer', 'Traffic Manager', 'Traffic Manager', 'Commercial Manager', 'Business Developer', 'Traffic Manager', 'Commercial Manager', 'Business Developer', 'Business Developer', 'Web Marketer'],                    'Experience': [1.00000, 3.00000, 3.00000, 1.50000, 2.00000, 6.00000, 0.00000, 4.00000, 8.00000, 5.00000, 0.50000, 3.00000, 3.00000, 0.00000, 2.00000, 3.00000, 0.50000, 3.00000, 3.00000, 8.00000, 3.50000]})levels = ["beginner", "intermediate", "advanced", "expert"]jobs = ["Commercial Manager", "Business Developer", "Web Marketer", "Traffic Manager"]def convert(levels, jobs):  for j in jobs:    df["Level"] = pd.qcut(df.loc[df["Job"] == j, "Experience"].rank(method="first"), q = 4, labels = levels, duplicates = "drop")  return dfconvert(levels, jobs)这是使用“qcut”后的输出:    Job                     Experience       Level 0   Commercial Manager      1.00000          NaN1   Traffic Manager         3.00000          intermediate2   Web Marketer            3.00000          NaN3   Commercial Manager      1.50000          NaN4   Commercial Manager      2.00000          NaN5   Web Marketer            6.00000          NaN6   Commercial Manager      0.00000          NaN7   Commercial Manager      4.00000          NaN8   Traffic Manager         8.00000          expert9   Business Developer      5.00000          NaN 10  Business Developer      0.50000          NaN 11  Web Marketer            3.00000          NaN 看来它只适用于“流量管理器”,并且level用 NaN 替换了其他体验。我真的迷失了。有什么帮助吗?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您想在 groupby 操作中执行此操作:


import numpy

import pandas


levels = ["beginner", "intermediate", "advanced", "expert"]

jobs = ["Commercial Manager", "Business Developer", "Web Marketer", "Traffic Manager"]


df = pandas.DataFrame({

    'Job': numpy.random.choice(levels, size=150), 

    'Experience': numpy.random.uniform(0.25, 10.5, size=150)

}).assign(

    level=df.groupby(['Job'])['Experience'] # for each unique job...

            # apply a quantile (quartile) cut 

            .apply(lambda g: pd.qcut(g, q=4, labels=levels, duplicates="drop"))

)


查看完整回答
反对 回复 2023-08-15
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

  # I would just change two things to what Paul suggested (jobs instead of levels and the rank(method="first") because there was still an error:


levels = ["beginner", "intermediate", "advanced", "expert"]

jobs = ["Commercial Manager", "Business Developer", "Web Marketer", "Traffic Manager"]


df = pandas.DataFrame({

  'Job': numpy.random.choice(jobs, size=150), 

  'Experience': numpy.random.uniform(0.25, 10.5, size=150)

}).assign(

  level=df.groupby(['Job'])['Experience'] # for each unique job...

        # apply a quantile (quartile) cut 

        .apply(lambda g: pd.qcut(g.rank(method="first"), q=4, labels=levels, duplicates="drop"))

)


查看完整回答
反对 回复 2023-08-15
  • 2 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信