【问题标题】:How to create multiple columns using pandas apply function如何使用熊猫应用功能创建多个列
【发布时间】:2021-05-10 14:47:47
【问题描述】:

假设我有以下 pandas 数据框,其中 n 列的名称从 u0 到 u(n-1)(在本例中为 n=3)。

import pandas as pd

df = pd.DataFrame(np.random.randn(5,3), columns=["u0","u1","u2"])
print(df)
         u0        u1        u2
0 -0.254454 -0.227589 -0.208454
1 -0.071567 -2.878662 -0.094863
2 -0.100024 -2.295788 -0.103415
3  0.091116 -0.143777  0.874170
4 -1.398530 -1.248449 -0.707336

现在我想计算 n 个名为 pn 的新列,其中每个单元格中的值除以行的总和。 cell(0,0) 的示例是 p(0,0) = u(0,0) / (u(0,0) + u(0,1) + u(0,2))

目前我正在通过将函数 p 应用于每一行来做到这一点。返回值是一个新的数据框,我在其中重命名列并最终合并两个数据框。

def p(row):
    u = row.loc["u0":"u2"]
    return u / u.sum()

df2 = df.apply(p, axis=1)
df2.columns = ["p0","p1","p2"]
df = pd.concat([df, df2], axis=1)

print(df)

         u0        u1        u2         p0          p1          p2
0 -0.254454 -0.227589 -0.208454 0.36850848 0.329601722 0.301889798
1 -0.071567 -2.878662 -0.094863 0.02350241 0.945344837 0.031152753
...

我不确定这是否是 pythonic 方式以及是否足够快。稍后我将有数千行和大约 100 列(但此值不是固定的,如本示例代码所示)。

非常感谢您的任何想法、cmets 或建议?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:
    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame(np.random.randn(5,3), columns=["u0","u1","u2"])
    
    # Do the calculation on all rows in one step, then rename the columns
    df_1 = df.div(df.sum(axis=1).values.reshape(-1, 1), axis=1)
    df_1.columns = df_1.columns.str.replace('u', 'p')
    
    df = df.join(df_1)
    

    输出:

    df
    Out[37]: 
             u0        u1        u2
    0 -0.899546 -0.069913 -0.668208
    1  0.554489 -2.039013 -0.823227
    2 -1.338628  0.668411  0.170418
    3 -0.616199  0.738712 -0.471407
    4 -0.559914  0.856356  0.178957
    
    df_1
    Out[39]: 
             p0        p1        p2
    0  0.549285  0.042690  0.408024
    1 -0.240272  0.883550  0.356723
    2  2.678337 -1.337362 -0.340974
    3  1.766148 -2.117293  1.351145
    4 -1.177774  1.801339  0.376435
    
    df
    Out[41]: 
             u0        u1        u2        p0        p1        p2
    0 -0.899546 -0.069913 -0.668208  0.549285  0.042690  0.408024
    1  0.554489 -2.039013 -0.823227 -0.240272  0.883550  0.356723
    2 -1.338628  0.668411  0.170418  2.678337 -1.337362 -0.340974
    3 -0.616199  0.738712 -0.471407  1.766148 -2.117293  1.351145
    4 -0.559914  0.856356  0.178957 -1.177774  1.801339  0.376435
    

    【讨论】:

    • 一步计算所有行在这种情况下非常有用,但我仍然需要这三个步骤。 (1:计算,2:重命名,3:连接)是否有更通用的解决方案来应用任何函数来创建可变的列数?
    • 我不确定我是否理解您的问题。对于您发布的具体问题,没有进一步简化流程的空间。确实有三个阶段。然而,它们在性能方面是最佳的,因为它们适用于整个数据。您使用 apply 采用的方法仍然包含三个步骤,但是 .apply() 逐行工作,因此效率远低于矢量化方法。
    猜你喜欢
    • 2019-12-19
    • 2017-03-14
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 2021-09-29
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多