如何在Pandas中同时向 dataframe 添加几列?

我有一个这样的 dataframe (通常具有更多的列和行):

    A   B
0   5  10
1  15   3

现在,我想向此数据帧添加列A_ratio和B_ratio,其中的值分别代表A /(A B)和B /(A B).因此,A_ratio和B_ratio在数据帧的每一行中总计为1.

我的第一次尝试是这样的:

import pandas as pd

df = pd.DataFrame({'A': [5,15], 'B': [10,3]})

for coli in df:
    df[coli + '_ratio'] = df[coli]/df.sum(axis=1)

给我以下结果:

    A   B   A_ratio   B_ratio
0   5  10  0.333333  0.652174
1  15   3  0.833333  0.159292

显然,列A_ratio和B_ratio的总和不为1.虽然A_ratio中的值正确,但在B_ratio中它们是错误的,因为添加A_ratio时行总和被更改.

一种解决方法是先复制 dataframe :

df2 = pd.DataFrame({'A': [5,15], 'B': [10,3]})
df2cl = df2.copy()

for coli in df2:
    df2[coli + '_ratio'] = df2[coli]/df2cl.sum(axis=1)

这给了我想要的输出:

    A   B   A_ratio   B_ratio
0   5  10  0.333333  0.666667
1  15   3  0.833333  0.166667

有没有一种更有效的方法可以避免复制数据帧?

最佳答案

您无需每次都调用sum.

 >>%timeit %run multiple_sum.py
   100 loops, best of 3: 6.59 ms per loop

 >>%timeit %run single_sum.py
   100 loops, best of 3: 3.84 ms per loop

如果您有一个大 dataframe ,这将是不必要的开销.

sums = df.sum(axis=1)

for coli in df:
    df[coli + '_ratio'] = df[coli]/sums

足够了