在 pandas 中从一个数据帧到另一个数据帧的每一行迭代获取差异

Getting the difference iterated over every row from one dataframe to another in pandas

我有两个数据集:df1 和 df2,每个数据集都有一个名为 'value' 的列,其中包含 10 条记录。目前我有:

df = df1.value - df2.value

但此代码仅输出 10 行(如预期)。如何迭代所有行的差异,而不仅仅是相应行索引之间的差异(并获得 100 条记录的 table)?

提前致谢!

你可以pandas.DataFrame.merge with how = 'cross' (cartesian product), then get the columns difference with pandas.DataFrame.diff:

#setup
df1 = pd.DataFrame({"value":[7,5,4,8,9]})
df2 = pd.DataFrame({"value":[1,7,9,5,3]})

df2.merge(df1, "cross", suffixes=['x','']).diff(axis = 1).dropna(1)

输出

   value
0       6
1       4
2       3
3       7
4       8
5       0
6      -2
7      -3
8       1
9       2
10     -2
11     -4
12     -5
13     -1
14      0
15      2
16      0
17     -1
18      3
19      4
20      4
21      2
22      1
23      5
24      6

试试这个。

ndf = df.assign(key=1).merge(df2.assign(key=1),on='key',suffixes=('_l','_r')).drop('key',axis=1)

ndf['value_l'] - ndf['value_r']

使用 outer 减法。

import numpy as np
import pandas as pd

df1 = pd.DataFrame({"value":[7,5,4,8,9]})
df2 = pd.DataFrame({"value":[1,7,9,5,3]})

np.subtract.outer(df1['value'].to_numpy(), df2['value'].to_numpy())
#array([[ 6,  0, -2,  2,  4],
#       [ 4, -2, -4,  0,  2],
#       [ 3, -3, -5, -1,  1],
#       [ 7,  1, -1,  3,  5],
#       [ 8,  2,  0,  4,  6]])

如果您想要与交叉连接相同的顺序,请添加 .ravel()

np.subtract.outer(df1['value'].to_numpy(), df2['value'].to_numpy()).ravel('F')

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