【问题标题】:compare 2 dataframes, loop through columns, calculate similarity on matching index比较 2 个数据帧,遍历列,计算匹配索引的相似度
【发布时间】:2020-09-23 22:37:39
【问题描述】:

我有两个几乎相同的数据框(A 和 B)。 A & B 中的所有列都具有相同的唯一标识符,顺序完全相同。

每个 DF(A 和 B)的指数几乎相似(农产品、熟食店、乳制品等)。 A 列包含完整索引,而 B 包含 A 的子集,但有时也可能与 A 完全匹配。

我已经设置了一个循环来同时比较每一列。我无法从每一列的每个索引中获取值。

示例数据框:

import numpy as np
import pandas as pd

nan = np.nan

# dfA
dfA = pd.DataFrame(
    np.array(
        [
            [1, 2, nan, nan], 
            [1, nan, 1, 2], 
            [nan,5,6, 1], 
            [4, 3, 3, nan],
            [nan, 1, nan, 2],
            [2, 1, nan, nan],
            [1, 3, 1, 2],
            [nan, nan, nan, 3],
            [3, nan, 1, 2],
            [2, nan, 2, nan],
        ]
    ),
    columns=['165413658', '546817846', '685413554', '54684114'],
    index=['dairy', 'produce', 'hot_deli', 'bakery', 'cold_deli', 'freshmeat', 'flowers', 'fruit', 'beer', 'wine'])

# dfB
dfB = pd.DataFrame(
    np.array(
        [
            [1, 2, nan, 1], 
            [nan, 4, 1, nan], 
            [4, nan, nan, 1], 
            [4, 3, 4, 2],
            [nan, 1, 2, 1],
            [1, nan, nan, 2],
            [nan, 3, 2, nan],
            [1, nan, 1, nan], 
        ]
    ),
    columns=['165413658', '546817846', '685413554', '54684114'],
    index=['dairy', 'bakery', 'wine', 'produce', 'hot_deli', 'cold_deli', 'flowers', 'beer']
)

到目前为止,这是我的代码:

utility_rate = []
for index, (userid1, userid2) in enumerate(zip(dfA, dfB)):
        act_count_dept = dfA[userid1]
        utility_rate.append(act_count_dept)

这会打印出我所有数据的列表,但我不确定如何有效地获取数据以比较 dfA 和 dfB 中的列。

基本上,我想获取 dfA 的第 n 列并计算行索引中的数据。然后,抓取 dfB 的第 n 列并计算这些行索引中的数据。最后,将 dfB / dfA 的值除以它们匹配的位置,并计算每个索引(面包店、农产品、熟食店等)的总匹配数。这是我的数据验证的一部分,其中 dfA 是真实数据,dfB 是我的预测我试图弄清楚它的预测是否与 dfA 类似。

想要的输出:

# dfC
dfC = pd.DataFrame(
    np.array(
        [
            [1, 1, nan, nan], 
            [0.25, nan, 0.25, 1], 
            [nan, 0.2, 0.33, 1], 
            [3, nan, 0.25, nan],
            [nan, nan, nan, 1],
            [nan, nan, nan, nan],
            [nan, 3, 0.5, nan],
            [nan, nan, nan, 3],
            [3, nan, nan, nan],
            [0.5, nan, nan, nan],
        ]
    ),
    columns=['165413658', '546817846', '685413554', '54684114'],
    index=['dairy', 'produce', 'fruit', 'bakery', 'cold_deli', 'freshmeat', 'flowers', 'hot_deli', 'beer', 'wine'])

您可能会从所需的输出中得知 dfA 中的某些索引不会在 dfB 中找到,反之亦然。理想情况下,我希望将多余的数据存储在另一个 DF 中,但这超出了这个问题的范围。

我认为代码会是这样的:

utility_rate = []
for index, (userid1, userid2) in enumerate(zip(dfA, dfB)):
        act_count_dept = dfA[userid1] # grab indices and its values
        # grab indices and its values for dfB
        # compare: if dfA index val == dfB index val:
        #                  final_calc= dfB.index / dfA.index
        #           elif no match:
        #              dump into other dfB

        utility_rate.append(final_calc)

【问题讨论】:

  • 计算数据是什么意思我想取dfA的第n列并计算行索引中的数据?为什么dfB/dfA 不适合你?
  • 例如,在“乳制品”索引中 A 和 B 的“165413658”列中都有一个 1。所以通过计数,我的意思是计算 1/1 = 1 或 100%。我试图验证 dfB 中的数据与 dfA 中的数据的匹配程度。

标签: python pandas numpy dataframe


【解决方案1】:

pandas 1.1.0 中有一个 compare()。您可以使用它来查找两个数据框中的总匹配百分比。我还没有测试过,但下面的代码应该给你一个具有相等值的数据框。获得该数据框后,您可以使用原始数据框形状和新数据框形状计算百分比。

dfA.compare(dfB,align_axis=1,keep_shape=False,keep_equal=True)

希望这至少能给你一个指针。更多想法请参考this

【讨论】:

  • 似乎是一种有趣的方法,没有所有循环垃圾。我会试试看,让你知道!感谢您的链接!
猜你喜欢
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多