【问题标题】:Apply pandas function to column to create multiple new columns error将熊猫函数应用于列以创建多个新列错误
【发布时间】:2021-12-30 09:42:22
【问题描述】:

对于this 的问题,我找到了这个例子:

df = pd.DataFrame([[i] for i in range(5)], columns=['num'])
def powers(x):
    return x, x**2, x**3, x**4, x**5, x**6
df['p1'], df['p2'], df['p3'], df['p4'], df['p5'], df['p6'] = zip(*df['num'].apply(powers))
df

我把map()函数改成了apply()函数,效果一样。

如您所见,我们为apply() 函数传递了一系列:zip(*df['num'].apply(powers))

这个问题的答案很好,但在我的研究案例中,我想通过添加双*双括号 df[['num']] 将数据帧传递给 apply() 函数:zip(*df[['num']].apply(powers)),但我收到以下错误:@ 987654330@.

我不明白错误在哪里,请你帮帮我吗?

【问题讨论】:

    标签: python pandas dataframe apply series


    【解决方案1】:

    在我看来,zipapply 不建议结合使用,因为可以使用添加多个新列:

    df = pd.DataFrame([[i] for i in range(5)], columns=['num'])
    def powers(x):
        
        return pd.Series([x, x**2, x**3, x**4, x**5, x**6])
    df[['p1','p2','p3','p4','p5','p6']] = df['num'].apply(powers)
    
    print (df)
       num  p1  p2  p3   p4    p5    p6
    0    0   0   0   0    0     0     0
    1    1   1   1   1    1     1     1
    2    2   2   4   8   16    32    64
    3    3   3   9  27   81   243   729
    4    4   4  16  64  256  1024  4096
    

    对于传递一列 DataFrame 可以使用:

    df = pd.DataFrame([[i] for i in range(5)], columns=['num'])
    def powers(x):
        
        return [x, x**2, x**3, x**4, x**5, x**6]
    df[['p1','p2','p3','p4','p5','p6']] = df[['num']].pipe(powers)
    
    print (df)
       num  p1  p2  p3   p4    p5    p6
    0    0   0   0   0    0     0     0
    1    1   1   1   1    1     1     1
    2    2   2   4   8   16    32    64
    3    3   3   9  27   81   243   729
    4    4   4  16  64  256  1024  4096
    

    对于多列:

    df = pd.DataFrame([[i] for i in range(5)], columns=['num'])
    df['new'] = df['num'] * 2
    def powers(x):
        
        return [x, x**2, x**3, x**4, x**5, x**6]
    
    
    df = pd.concat(df[['num','new']].pipe(powers), axis=1, keys=['p1','p2','p3','p4','p5','p6'])
    df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
    print (df)
       p1_num  p1_new  p2_num  p2_new  p3_num  p3_new  p4_num  p4_new  p5_num  \
    0       0       0       0       0       0       0       0       0       0   
    1       1       2       1       4       1       8       1      16       1   
    2       2       4       4      16       8      64      16     256      32   
    3       3       6       9      36      27     216      81    1296     243   
    4       4       8      16      64      64     512     256    4096    1024   
    
       p5_new  p6_num  p6_new  
    0       0       0       0  
    1      32       1      64  
    2    1024      64    4096  
    3    7776     729   46656  
    4   32768    4096  262144  
    

    【讨论】:

      【解决方案2】:

      替代方案如下。

      def powers(n):
          n=6
          cols=[x for x in np.arange(0,n+1)]
          for col in cols:
              df[f'num_{str(col)}'] = df['num'].apply(lambda x:x**col)
          return df
      powers(df)
      

      结果1

          num  num_0  num_1  num_2  num_3  num_4  num_5  num_6
      0    0      1      0      0      0      0      0      0
      1    1      1      1      1      1      1      1      1
      2    2      1      2      4      8     16     32     64
      3    3      1      3      9     27     81    243    729
      4    4      1      4     16     64    256   1024   4096
      

      如果你需要 p,这可以做到

      def powers(n):
          n=6
          cols=[x for x in np.arange(1,n+1)]
          for col in cols:
              df[f'p{str(col)}'] = df['num'].apply(lambda x:x**col)
          return df
      print(powers(df))
      

      结果 2

          num  p1  p2  p3   p4    p5    p6
      0    0   0   0   0    0     0     0
      1    1   1   1   1    1     1     1
      2    2   2   4   8   16    32    64
      3    3   3   9  27   81   243   729
      4    4   4  16  64  256  1024  4096
      

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 1970-01-01
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 2020-04-22
        相关资源
        最近更新 更多