对于这个问题,我找到了这个例子:
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热心网友回复:
在我看来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
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 评论