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