【问题标题】:Creating new columns in pandas based on conditions satisfied by the columns using functions根据使用函数的列满足的条件在熊猫中创建新列
【发布时间】:2017-08-14 10:16:32
【问题描述】:

我在 pandas 数据框中有几列。基于每一列,我需要创建一个新列。此功能有效:

def f(row):
    if row['col_1'] == 0:
        val = 'Neutral'
    elif row['col_1'] > 0:
        val = 'Growth'
    else:
        val = 'Contraction'
    return val

df['New_Col_1'] = df.apply(f(row) , axis=1)

但由于我有几列用于比较(col_2、col_3 等),我想将列的名称作为参数传递给函数。

def f(row,col_name):
    if row[col_name] == 0:
        val = 'Neutral'
    elif row[col_name] > 0:
        val = 'Growth'
    else:
        val = 'Contraction'
    return val

df['New_Col_1'] = df.apply(f(row,'col_1') , axis=1)

但是,有一个错误。它说参数“行”没有定义。我该如何克服这个问题?

【问题讨论】:

  • 您缺少lambda 函数:df.apply(lambda row: f(row,'col_1') , axis=1)
  • 这行得通。谢谢!!

标签: python python-2.7 pandas dataframe


【解决方案1】:

查看df.loc[],它需要两个参数,您可以将它们视为行规范和列规范,因此您可以这样使用它:

df['New_Col_1'] = 'Contraction' # Default, to be overwritten below
df.loc[df['col_1'] == 0, 'New_Col_1'] = 'Neutral'
df.loc[df['col_1'] > 0, 'New_Col_1'] = 'Growth'

【讨论】:

    【解决方案2】:

    您可以使用 df.loc[condition, column_name] = value 过滤一个 df 并写入一个新值:

    df['New_Col_1'] = None # initial
    df.loc[df.col1==0, 'New_Col_1'] = 'Neutral'
    df.loc[df.col1>0, 'New_Col_1'] = 'Growth'
    df.loc[df.col1<0, 'New_Col_1'] = 'Contraction'
    

    【讨论】:

      【解决方案3】:

      df.apply() 缺少注释中提到的 lambda 函数。

      def f(row,col_name):
          if row[col_name] == 0:
              val = 'Neutral'
          elif row[col_name] > 0:
              val = 'Growth'
          else:
              val = 'Contraction'
          return val
      
      df['New_Col_1'] = df.apply(lambda row: f(row,'col_1') , axis=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 2021-12-24
        • 1970-01-01
        • 2017-09-10
        • 1970-01-01
        • 2021-04-20
        相关资源
        最近更新 更多