如何用另一个数据框的一行来减去数据框中的所有行?

11

我想从一个dataframe中的所有行减去另一个dataframe中的一行。(与一行的差异)

是否有简单的方法可以做到这一点?就像df-df2这样的操作?

df = pd.DataFrame(abs(np.floor(np.random.rand(3, 5)*10)),
...                 columns=['a', 'b', 'c', 'd', 'e'])
df

Out[18]:
   a  b  c  d  e
0  8  9  8  6  4
1  3  0  6  4  8
2  2  5  7  5  6


df2 = pd.DataFrame(abs(np.floor(np.random.rand(1, 5)*10)),
...                 columns=['a', 'b', 'c', 'd', 'e'])
df2

   a  b  c  d  e
0  8  1  3  7  5

这里有一个适用于第一行的输出,但是我希望剩下的行也被减去...

df-df2

    a   b   c   d   e
0   0   8   5  -1  -1
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN
3个回答

18

Pandas的NDFrames通常尝试在具有匹配索引的项目上执行操作。df-df2仅在第一行执行减法,因为索引为0的行是唯一一个共享索引的行。

您正在寻找的操作看起来更像是使用“广播”执行的NumPy数组操作:

In [21]: df.values-df2.values
Out[21]: 
array([[ 0,  8,  5, -1, -1],
       [-5, -1,  3, -3,  3],
       [-6,  4,  4, -2,  1]], dtype=int64)

将结果封装在DataFrame中:

In [22]: pd.DataFrame(df.values-df2.values, columns=df.columns)
Out[22]: 
   a  b  c  d  e
0  0  8  5 -1 -1
1 -5 -1  3 -3  3
2 -6  4  4 -2  1

6

您也可以直接在pandas中完成此操作。(我使用了df2 = df.loc[[0]]

In [80]: df.sub(df2,fill_value=0)
Out[80]: 
   a  b  c  d  e
0  0  0  0  0  0
1  7  6  0  7  8
2  4  4  3  6  2

[3 rows x 5 columns]

我认为重点是确保所有df的行都被减去。 - yash

1

或者,您可以在df的所有行上直接使用apply函数。

df3 = df.apply(lambda x: x-df2.squeeze(), axis=1)
# axis=1 because it should apply to rows instead of columns
# squeeze because we would like to substract Series

1
这会慢得多,因为你需要对齐每一行! - Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接