【发布时间】: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 或建议?
【问题讨论】: