如何比较一个数据帧的所有行

时间:2021-06-27 10:57:14

标签: python-3.x pandas

我有一个这样的数据框:

Customer A B
[Boby    1 2]
[Alan    5 3]
[Tom     7 1]

注意:例如,这只是数据框的一部分(只有几千行,几十列)。

对于每对客户,我需要找到 A 和 B 每一行之间差异的平方和。

Boby-Alan 计算示例: ((1-5) ^ 2 + (2-3) ^ 2) = 16 + 1 = 17

鲍比-汤姆 ((1-7) ^ 2 + (2-1) ^ 2) = 36 + 1 = 37

艾伦-汤姆 ((5-7) ^ 2 + (3-1) ^ 2) = 4 + 4 = 8

问题 1:如何进行这样的计算?

我尝试搜索,但有一些带有循环的示例,但我无法弄清楚它们:(

问题 2:我应该以什么形式存储这样的视图?

我认为的形式:

Сustomer1 Сustomer2 Sum
Boby       Alan      17
Boby       Tom       37
Alan       Tom        8

如果问题不清楚并需要任何解释,请在评论中告诉我。

1 个答案:

答案 0 :(得分:1)

一种方式:

创建所有可能的组合:

from itertools import combinations
df1 = pd.DataFrame((combinations(df.Customer, 2)),
                   columns=['Customer1', 'Customer2'])

计算总和(方法 1):

df1['sum'] = df1.apply(lambda x: x.map(df.set_index('Customer').apply(np.array, 1))).apply(
    lambda x:  np.sum(np.square(x['Customer1'] - x['Customer2'])), 1)

方法二:

map_dict = df.set_index('Customer').apply(np.array, 1).to_dict()
a = df1.applymap(lambda x: map_dict[x]).values
df1['sum'] = np.sum(np.vstack(np.square(a[:, 0] - a[:, 1])), 1)

输出:

  Customer1 Customer2  sum
0      Boby      Alan   17
1      Boby       Tom   37
2      Alan       Tom    8