Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫应用于dataframe列以返回多个带后缀的列_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫应用于dataframe列以返回多个带后缀的列

Python 熊猫应用于dataframe列以返回多个带后缀的列,python,pandas,dataframe,Python,Pandas,Dataframe,需要对每列返回2列(col_sin和col_cos)的列进行sin和cos转换 def transform(data, var): sin_ = np.sin(data - var) cos_ = np.cos(data - var) return pd.Series([sin_, cos_], index=['sin', 'cos'] 返回(由于COL与实际传递的COL不同,因此数字不正确): 预期输出应该有4列:col1_sin、col1_cos、col2_sin和

需要对每列返回2列(col_sin和col_cos)的列进行sin和cos转换

def transform(data, var):
    sin_ = np.sin(data - var)
    cos_ = np.cos(data - var)
    return pd.Series([sin_, cos_], index=['sin', 'cos']
返回(由于COL与实际传递的COL不同,因此数字不正确):

预期输出应该有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_))

谢谢

无需在此处应用
。您应该传递整个数据帧。我们可以
concat
添加后缀
,以获得正确的名称。使用
np.broadcast\u to
我们可以处理单个偏移量或形状正确的列表/数组:

import pandas as pd
import numpy as np

def transform(data, var, degrees=True):
    """
    data : pd.DataFrame
    var : numeric, or list/array of numerics. Should be 
          broadcastable to data.shape
    """
    data = data - np.broadcast_to(var, data.shape)
    # data = data - var # also works for compatible shapes         

    if degrees:
        data = np.radians(data)

    return pd.concat([np.sin(data).add_suffix('_sin'),
                      np.cos(data).add_suffix('_cos')],
                     axis=1)


无需在此处应用
。您应该传递整个数据帧。我们可以
concat
添加后缀
,以获得正确的名称。使用
np.broadcast\u to
我们可以处理单个偏移量或形状正确的列表/数组:

import pandas as pd
import numpy as np

def transform(data, var, degrees=True):
    """
    data : pd.DataFrame
    var : numeric, or list/array of numerics. Should be 
          broadcastable to data.shape
    """
    data = data - np.broadcast_to(var, data.shape)
    # data = data - var # also works for compatible shapes         

    if degrees:
        data = np.radians(data)

    return pd.concat([np.sin(data).add_suffix('_sin'),
                      np.cos(data).add_suffix('_cos')],
                     axis=1)

简单for循环 可以通过沿列名使用simple for循环,并添加sin/cos列来获得结果。我测试了一百万列,不到一秒钟就完成了

df=pd.DataFrame(np.random.uniform(低=0,高=3.14,大小=(1000000,2)),列=['column1','column2'])
var=[0,5]
对于idx,枚举中的列(df.columns):
df[column+''u sin']=np.sin(df[column]-var[idx])
df[column+'_cos']=np.cos(df[column]-var[idx])
df.head()
它将为您提供如下输出

    column1     column2     column1_sin     column1_cos     column2_sin     column2_cos
0   1.977094    0.705613    0.918590    -0.395211   0.648500    0.761214
1   2.138289    2.246560    0.843252    -0.537519   0.780229    -0.625493
2   2.947415    1.716964    0.192960    -0.981207   0.989336    -0.145648
3   1.738969    0.748142    0.985892    -0.167381   0.680278    0.732954
4   1.136741    1.190389    0.907268    0.420554    0.928513    0.371299
另一种选择 更改轴=1并返回pd.Series。 示例代码是

d = {'col1': [0, 15, 30, 45, 60], 'col2': [0, 60, 180, 240, 300]}
df = pd.DataFrame(data=d)
def transform(data, var):
    return np.sin(data-var).add_suffix('_sin').append(np.cos(data-var).add_suffix('_cos'))

df.apply(transform, axis=1, var=[10,20])
这给了你输出

    col1_sin    col2_sin    col1_cos    col2_cos
0   0.544021    -0.912945   -0.839072   0.408082
1   -0.958924   0.745113    0.283662    -0.666938
2   0.912945    0.219425    0.408082    -0.975629
3   -0.428183   0.088399    -0.903692   0.996085
4   -0.262375   -0.387809   0.964966    -0.921740
简单for循环 可以通过沿列名使用simple for循环,并添加sin/cos列来获得结果。我测试了一百万列,不到一秒钟就完成了

df=pd.DataFrame(np.random.uniform(低=0,高=3.14,大小=(1000000,2)),列=['column1','column2'])
var=[0,5]
对于idx,枚举中的列(df.columns):
df[column+''u sin']=np.sin(df[column]-var[idx])
df[column+'_cos']=np.cos(df[column]-var[idx])
df.head()
它将为您提供如下输出

    column1     column2     column1_sin     column1_cos     column2_sin     column2_cos
0   1.977094    0.705613    0.918590    -0.395211   0.648500    0.761214
1   2.138289    2.246560    0.843252    -0.537519   0.780229    -0.625493
2   2.947415    1.716964    0.192960    -0.981207   0.989336    -0.145648
3   1.738969    0.748142    0.985892    -0.167381   0.680278    0.732954
4   1.136741    1.190389    0.907268    0.420554    0.928513    0.371299
另一种选择 更改轴=1并返回pd.Series。 示例代码是

d = {'col1': [0, 15, 30, 45, 60], 'col2': [0, 60, 180, 240, 300]}
df = pd.DataFrame(data=d)
def transform(data, var):
    return np.sin(data-var).add_suffix('_sin').append(np.cos(data-var).add_suffix('_cos'))

df.apply(transform, axis=1, var=[10,20])
这给了你输出

    col1_sin    col2_sin    col1_cos    col2_cos
0   0.544021    -0.912945   -0.839072   0.408082
1   -0.958924   0.745113    0.283662    -0.666938
2   0.912945    0.219425    0.408082    -0.975629
3   -0.428183   0.088399    -0.903692   0.996085
4   -0.262375   -0.387809   0.964966    -0.921740
用于传递所有
DataFrame
,如果
var
是与列数相同大小的列表,也可以减去它们,将DataFrames连接在一起并返回具有新列名称的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
用于传递所有
DataFrame
,如果
var
是与列数相同大小的列表,也可以减去它们,将DataFrames连接在一起并返回具有新列名称的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

我担心这里的执行速度,因为真正的df包含数十万到一百万的行,但没有那么多的列。使用simple for loop可以完成,正如在我编辑的答案中一样,我担心这里的执行速度,因为实际的df包含数十万到一百万的行,但没有那么多的列。使用简单的for循环可以完成,就像在我编辑的答案中一样。