![](/img/trans.png)
[英]How to compare each row from one dataframe against all the rows from other dataframe and calculate distance measure?
[英]How to calculate the difference of a row's column values against all other rows with multiple values in a dataframe? Iterate for every row
主要目标:找到销售玩具的城市彼此差异最大(前 10 名差异)。 例如,洛杉矶销售的玩具 3 和 4 最多,与之最相反的城市是盐湖城,它销售玩具 9 和 15 最多,玩具 3 和 4 最少。
我有一个 CSV 已放入 dataframe。
它目前有数百行,每行有 15 列......示例:
城市 | 玩具1 | 玩具2 | 玩具3 | 玩具N |
---|---|---|---|---|
洛杉矶 | 15 | 20 | 1 | 44 |
迈阿密 | 33 | 2 | 545 | 15 |
达拉斯 | 111 | 222 | 545 | 448 |
N市 | 15 | 555 | 44 | 987 |
所以我需要洛杉矶通过 ToyN 将 Toy1 与所有其他城市 Toy2 进行比较。 然后针对每个城市的 dataframe 中的行的 rest 以此类推。
我在构建这个时遇到了麻烦,因为我需要对每一列进行计算差异并在每个城市之间进行比较。
预期 Output:一个新列,城市与城市的得分不同。 示例:|City|Toy1|Toy2|Toy3|ToyN|DiffMiami|Diff Dallas| |----|----|----|----|----|----|----| |洛杉矶|15|20|1|44|-17|15|
我一直在尝试使用 DataFrame.diff() 但不确定如何在这种情况下使用它。 任何建议都会很乐意采纳。 谢谢。
在我提出的解决方案中,对于每对城市 A,B,我们计算 sum_i(abs(toy_i(A) - toy_i(B))) 其中 toy_i(A) 是我在城市 A 销售的玩具数量等
我们将结果报告为城市矩阵
这是在numpy
中最容易完成的
首先我们加载数据
from io import StringIO
data = StringIO('''
City Toy1 Toy2 Toy3 ToyN
LosAngeles 15 20 1 44
Miami 33 2 545 15
Dallas 111 222 545 448
CityN 15 555 44 987
''')
df = pd.read_csv(data, sep = '\s+')
df2 = df.set_index('City')
v = df2.values
然后是一点 numpy 魔法,灵感来自https://stackoverflow.com/a/46266707/14551426 ,计算 abs 差异的成对和,并转换回 df
res = np.sum(np.abs(v - v[:, None]),axis=2)
df3 = pd.DataFrame(data = res, index = df2.index, columns = df2.index)
df3
output:
City LosAngeles Miami Dallas CityN
City
LosAngeles 0 609 1246 1521
Miami 609 0 731 2044
Dallas 1246 731 0 1469
CityN 1521 2044 1469 0
我们看到最大值是迈阿密/CityN 组合,因此这是差异最大的两个城市
在这里找到前 10 个最大的数字也不会太难:
df3.unstack().sort_values()
生产
City City
LosAngeles LosAngeles 0
Miami Miami 0
Dallas Dallas 0
CityN CityN 0
LosAngeles Miami 609
Miami LosAngeles 609
Dallas 731
Dallas Miami 731
LosAngeles Dallas 1246
Dallas LosAngeles 1246
CityN 1469
CityN Dallas 1469
LosAngeles CityN 1521
CityN LosAngeles 1521
Miami CityN 2044
CityN Miami 2044
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.