Skip to main content
 首页 » 编程设计

python之Pandas 应用于数据框列以返回带有后缀的多列

2025年05月04日17kuangbin

需要对列进行 sin 和 cos 转换,其中每列将返回 2 列,col_sin 和 col_cos

def transform(data, var): 
    sin_ = np.sin(data - var) 
    cos_ = np.cos(data - var) 
    return pd.Series([sin_, cos_], index=['sin', 'cos'] 
d = {'col1': [0, 15, 30, 45, 60], 'col2': [0, 60, 180, 240, 300]} 
df = pd.DataFrame(data=d) 
df = df.apply(transform, axis=0, var=0) 

返回(数字不正确,因为cols与实际传递的cols不同):

+-----+----------------------------+----------------------------+ 
|     | col1                       | col2                       | 
|-----+----------------------------+----------------------------| 
| sin | 0    0.000000e+00          | 0    0.000000e+00          | 
|     | 1    1.000000e+00          | 1   -1.133108e-15          | 
|     | 2    5.665539e-16          | 2   -7.347881e-16          | 
|     | 3   -1.000000e+00          | 3   -4.532431e-15          | 
|     | 4   -1.133108e-15          | 4   -1.224647e-15          | 
|     | Name: col1, dtype: float64 | Name: col2, dtype: float64 | 
| cos | 0    1.000000e+00          | 0    1.0                   | 
|     | 1    2.832769e-16          | 1    1.0                   | 
|     | 2   -1.000000e+00          | 2    1.0                   | 
|     | 3   -1.836970e-16          | 3    1.0                   | 
|     | 4    1.000000e+00          | 4    1.0                   | 
|     | Name: col1, dtype: float64 | Name: col2, dtype: float64 | 
+-----+----------------------------+----------------------------+ 

预期输出应该有 4 列:col1_sin、col1_cos、col2_sin 和 col2_cos

我怎样才能做到这一点?

还有一种方法可以将 var 作为列表/元组传递,其中 var[0] 用于 col1,var[1] 用于 col2?像这样:

df = df.apply(transform, axis=0, var=[0, 60]) 

有没有办法用 raw=True 来加快速度?这样的事情是行不通的

def transform(data, var): 
    sin_ = np.sin(data - var) 
    cos_ = np.cos(data - var) 
    return np.column_stack((sin_, cos_)) 

谢谢!

请您参考如下方法:

使用DataFrame.pipe对于传递所有 DataFrame,如果 var 是具有相同大小的列表,例如列数可以减去它们,将 DataFrame 连接在一起并返回具有新列名称的 DataFrame:

def transform(data, var): 
    sin_ = np.sin(data - var) 
    cos_ = np.cos(data - var) 
    arr =  np.column_stack((sin_, cos_)) 
    c = (data.columns + '_sin').tolist() + (data.columns + '_cos').tolist() 
    return pd.DataFrame(arr, index=df.index, columns=c) 
 
d = {'col1': [0, 15, 30, 45, 60], 'col2': [0, 60, 180, 240, 300]} 
df = pd.DataFrame(data=d) 
 
df = df.pipe(transform, var=[0, 60]) 
print (df) 
   col1_sin  col2_sin  col1_cos  col2_cos 
0  0.000000  0.304811  1.000000 -0.952413 
1  0.650288  0.000000 -0.759688  1.000000 
2 -0.988032  0.580611  0.154251  0.814181 
3  0.850904 -0.801153  0.525322 -0.598460 
4 -0.304811  0.945445 -0.952413  0.325781