拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 将熊猫函式应用于列以创建多个新列错误

将熊猫函式应用于列以创建多个新列错误

白鹭 - 2022-01-23 2136 0 0

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

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))

这个问题的答案是好的,但在我研究的情况下,我想传递一个资料帧的apply()功能:zip(*df[['num']].apply(powers))通过增加双*双括号df[['num']],但我得到了以下错误:ValueError: not enough values to unpack (expected 6, got 3)

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

uj5u.com热心网友回复:

在我看来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  

uj5u.com热心网友回复:

替代方案如下。

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
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *