如何用另一列(熊猫)中的每个值减去列值

时间:2020-03-12 10:33:31

标签: python pandas numpy

我有两列A和B。我想用A列中的每个值减去B列的值,并在不使用for循环的情况下创建新列。

下面是我的数据框

    A   B
0   5   3
1   3   2
2   8   1

所需的输出

    A   B   C   D   E
0   5   3   2   3   4   
1   3   2   0   1   2
2   8   1   5   6   7

C = A - B[0]
D = A - B[1]
E = A - B[2]

3 个答案:

答案 0 :(得分:3)

使用numpy的数组broadcasting

df = pd.DataFrame({'A':[5, 3, 8],
                   'B':[3, 2, 1]})

df2 = pd.DataFrame(df['A'].values[:, None] - df['B'].values, columns=['C', 'D', 'E'])

df = df.join(df2)

结果:

   A  B  C  D  E
0  5  3  2  3  4
1  3  2  0  1  2
2  8  1  5  6  7

说明

>>> df['A'].values[:, None]

array([[5],
       [3],
       [8]])

>>> df['B'].values

array([3, 2, 1])

减去它们时,numpy将df['A'].values[:, None]拉伸为:

array([[5, 5, 5],
       [3, 3, 3],
       [8, 8, 8]])

df['B'].values到:

array([[3, 2, 1],
       [3, 2, 1],
       [3, 2, 1]])

相减的结果是:

array([[2, 3, 4],
       [0, 1, 2],
       [5, 6, 7]])

答案 1 :(得分:0)

您在这里:

d = pd.DataFrame.from_dict({'A': {0: 5, 1: 3, 2: 8}, 'B': {0: 3, 1: 2, 2: 1}})
m = d.shape[0]
cols = [chr(67 + x) for x in range(m)]
d.join(pd.DataFrame(np.broadcast_to(d['A'], (m, m)).T - np.broadcast_to(d['B'], (m, m)), columns=cols))

说明:将每个系列广播到3x3矩阵中,然后减去它们,将其制成数据框,然后将其加入原始图像中。列是自动生成的。

答案 2 :(得分:0)

这可能会有所帮助:
1.根据数据帧的长度复制列A
2.将B转换为numpy数组
3.从A减去B,这将使您每行减去一次
4.连接回主数据

NAME