【问题标题】:How do I created a function to do a new column in panda dataset based on conditions, error如何创建一个函数来根据条件在熊猫数据集中创建一个新列,错误
【发布时间】:2022-07-21 21:13:44
【问题描述】:

我一直在尝试在数据集中创建一个新列,但是没有成功。

    df2 = pd.DataFrame([[1, 'born'], [2, '8 a 14'], [3,'born'], [4,'14 a 21'], [8,'0 a 7'], [10,'die'], [7,'lost']], columns = ["Pen",'Result']) def myFunc(record):
    for i in df['Result']:
        if (df['Result']=='born').any():
            return 'eclosion'
        elif (df['Result']=='1 a 7').any():
            return 'early'
        elif (df['Result']=='8 a 14').any():
            return 'mediun'
        elif (df['Result']=='15 a 21').any():
            return 'late'
df['Final'] = df.apply(myFunc, axis=1)
df

这就是结果:

【问题讨论】:

  • 是你显示的结果不正确的结果吗?

标签: python pandas function


【解决方案1】:

您的代码中的问题是您的Result 列包含born,因此(df['Result']=='born').any() 将返回True 并且永远不会进入elif 部分。

您可以改用np.select

df['Final'] = np.select(
    [df['Result']=='born', df['Result']=='1 a 7',
     df['Result']=='8 a 14', df['Result']=='15 a 21'],
    ['eclosion', 'early', 'mediun', 'late'],
    df['Result']
)

【讨论】:

  • 注意这会让你做很多比较,map效率更高
【解决方案2】:

一旦您将第一行中的 df2 更改为 df 以匹配其余代码,整个代码对我来说非常完美。

【讨论】:

    【解决方案3】:

    首先,如果您的目标对map 来说很简单,请使用:

    d = {'born': 'eclosion', '1 a 7': 'early', '8 a 14':'mediun', '15 a 21': 'late'}
    
    df2['Final'] = df2['Result'].map(d)
    # or to keep original values on no match:
    df2['Final2'] = df2['Result'].map(d).fillna(df2['Result'])
    

    输出:

       Pen   Result     Final    Final2
    0    1     born  eclosion  eclosion
    1    2   8 a 14    mediun    mediun
    2    3     born  eclosion  eclosion
    3    4  14 a 21       NaN   14 a 21
    4    8    0 a 7       NaN     0 a 7
    5   10      die       NaN       die
    6    7     lost       NaN      lost
    
    

    如果您想要显示的输出,请按所需顺序找到第一个值并将其映射:

    d = {'born': 'eclosion', '1 a 7': 'early', '8 a 14':'mediun', '15 a 21': 'late'}
    idx = (df2.drop_duplicates('Result').set_index('Result')
              .reindex(list(d)).first_valid_index()
           )
    
    df2['Final'] = d.get(idx, None)
    

    输出:

       Pen   Result     Final
    0    1     born  eclosion
    1    2   8 a 14  eclosion
    2    3     born  eclosion
    3    4  14 a 21  eclosion
    4    8    0 a 7  eclosion
    5   10      die  eclosion
    6    7     lost  eclosion
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2019-03-27
      • 2020-10-06
      • 2022-01-08
      相关资源
      最近更新 更多