首页 > 解决方案 > 如何比较一个数据框的所有行

问题描述

我有一个这样的数据框:

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

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

标签: python-3.xpandas

解决方案


单程:

创建所有可能的组合:

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

推荐阅读