【问题标题】:Pandas multi column input to multi column outputPandas 多列输入到多列输出
【发布时间】: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 可能看起来有点傻,但是我在数据框中还有很多其他信息,我需要转换一些数字列,同时保持所有索引和其他信息直截了当。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是一种更易读的方法:

    out = df[['r', 'theta']].apply(rtheta_to_xy, 1).apply(pd.Series)                               
    df = df.assign(x=out[0], y=out[1])
    

    顺便说一句,当您只是转发相同的参数时,您对 lambda 的使用是可有可无的。

    【讨论】:

    • 它的可读性略高,很好的建议。此外,关于 lambda 的好点。我最初用 unpack 的参数制作了这个例子,并且心不在焉地忘记了一旦我把它们打包在一起,lambda 就一文不值了——doh。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2020-08-20
    • 2016-05-17
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多