我想从另一个数据帧中减去一行中的所有行。 (与一行不同)
有一种简单的方法吗? (如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
答案 0 :(得分:15)
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
答案 1 :(得分:6)
您也可以直接在熊猫中执行此操作。 (我使用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]
答案 2 :(得分: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