我有两列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]
答案 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