【问题标题】:Python: Evaluate the output of my functionsPython:评估我的函数的输出
【发布时间】:2019-03-02 05:46:35
【问题描述】:

我有一个包含许多列的大型数据框,但我只特别关注一列。

这个例子是为了简单起见。我定义了一个新列 col2,如果满足第一列中的条件,它将存储一个布尔值。

raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
df = pd.DataFrame(raw_data, columns = ['col1'])
df

df['col2'] = 'default'
df

                     col1                   col2
row1         [2,3,44,89.6,...]            default
row2         [10,4,33.3,1.11,...]         default

我需要对 col1 进行一些计算,如果满足某些条件,则同一行中 col2 中的默认值变为 True,否则为 False。

简化计算

计算列表中的最大值、列表的长度和平均值。

我在一个函数中进行这些计算,然后我引入另一个函数来尝试执行评估部分。

例如,如果最大值 > 10,如果列表长度 > 5,如果平均值 > 25,则将 col2 中的默认值设为 True。

我相信我必须使用 .apply() 函数。

df['col2'] = df.apply (lambda row: my_functions (row),axis=1)

所需输出

                   col1                   col2
row1         [2,3,44,89.6,...]            True
row2         [10,4,33.3,1.11,...]         False

我被困在这里,因为我不知道如何进行一些计算并遍历整个列并评估这些计算。

谢谢!

【问题讨论】:

    标签: python pandas dataframe apply


    【解决方案1】:

    如果你有一个大数据框,你可以使用向量化函数:

    def my_func(l):
        return (max(l) > 10) and (len(l) > 5) and (np.mean(l) > 25)
    
    my_func = np.vectorize(my_func)
    
    df['col2'] = my_func(df['col1'].values)
    

    输出:

    col1                        col2
    [0, 2, 3, 4]                False
    [6, 7, 1000, 40, 20, 13]    True
    [4, 20, 100]                False
    

    【讨论】:

      【解决方案2】:

      有几种方法可以做到这一点,但您不需要在进行计算之前设置col2。您可以在apply 属性中添加您选择的功能。请记住,使用apply 的函数的输入是逐行

      raw_data = { 'col1': [[0, 2, 3, 4],[6, 7, 1000, 40, 20],[4, 20, 100]]}
          df = pd.DataFrame(raw_data, columns = ['col1'])
      
          # if max(list) > 10 --> True
      
      def my_function (row):
      
          if max(row['col1'])>10:
              row = True
          else:
              row = False
          return row
      
      
      df['col2'] = df.apply(my_function, axis =1)
      
      df
                         col1   col2
      0          [0, 2, 3, 4]  False
      1  [6, 7, 1000, 40, 20]   True
      2          [4, 20, 100]   True
      

      【讨论】:

        【解决方案3】:

        这是一种方法:

        raw_data = {'col1': [[0, 2, 3, 4], [6, 7, 1000, 40, 20, 13], [4, 20, 100]]}
        df = pd.DataFrame(raw_data, columns=['col1'])
        
        def my_functions(r):
            nb = len(r.col1)
            average = sum(r.col1) / nb
            maxl = max(r.col1)
            return maxl > 10 and len(r.col1) > 5 and average > 25
        
        
        df['col2'] = df.apply(lambda row: my_functions(row), axis=1)
        print(df)
        

        输出:

                               col1   col2
        0              [0, 2, 3, 4]  False
        1  [6, 7, 1000, 40, 20, 13]   True
        2              [4, 20, 100]  False
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-28
          • 1970-01-01
          • 2014-09-14
          • 2023-01-12
          • 1970-01-01
          • 2011-02-12
          相关资源
          最近更新 更多