Python 熊猫应用于dataframe列以返回多个带后缀的列
需要对每列返回2列(col_sin和col_cos)的列进行sin和cos转换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和
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循环可以完成,就像在我编辑的答案中一样。