【发布时间】:2022-01-24 23:20:38
【问题描述】:
我正在尝试找到一种在 pandas 数据框中的列上运行(非线性、单射、多变量)转换的好方法。 Transform 是一个黑盒子,里面有多个变量,多个变量出来。
作为一个简单的说明,让我们考虑将 r, theta 坐标转换为 x, y 坐标。运行此设置/上下文
# set up example (all this is given in my case)
def blackbox_transform(rtheta):
x = rtheta[0]*np.cos(rtheta[1])
y = rtheta[0]*np.sin(rtheta[1])
return (x, y)
n = 50
r = np.ones(n)
theta = np.linspace(0, np.pi / 2, n)
r_theta = np.concatenate((r[:, None], theta[:, None]), axis=1)
df = pd.DataFrame(data=r_theta, columns=['r', 'theta'])
对于解决方案,这是我能想到的最好的解决方案,但是应用和解包似乎很笨拙(希望熊猫向导有更好的方法):
# solution
xy = df[['r', 'theta']].apply(blackbox_transform, axis=1)
df = pd.concat((df, pd.DataFrame(data=[*xy], columns=['x', 'y'], index=xy.index)), axis=1)
我知道在这里使用 pandas 可能看起来有点傻,但是我在数据框中还有很多其他信息,我需要转换一些数字列,同时保持所有索引和其他信息直截了当。
【问题讨论】: