Apply pandas function to column to create multiple new columns 错误
Apply pandas function to column to create multiple new columns error
对于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))
。
这个问题的答案很好,但在我的研究案例中,我想将数据帧传递给 apply()
函数,如下所示: zip(*df[['num']].apply(powers))
通过添加双*双括号 df[['num']]
,但我收到以下错误:ValueError: not enough values to unpack (expected 6, got 3)
.
我没明白哪里错了,请问能帮帮我吗?
在我看来 zip
和 apply
不推荐合并,添加多个新列可以使用:
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
备选方案如下。
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
对于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))
。
这个问题的答案很好,但在我的研究案例中,我想将数据帧传递给 apply()
函数,如下所示: zip(*df[['num']].apply(powers))
通过添加双*双括号 df[['num']]
,但我收到以下错误:ValueError: not enough values to unpack (expected 6, got 3)
.
我没明白哪里错了,请问能帮帮我吗?
在我看来 zip
和 apply
不推荐合并,添加多个新列可以使用:
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
备选方案如下。
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