比较2个数据帧,循环列,计算匹配索引的相似性

2024-09-22 20:37:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个几乎相同的数据帧(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)

Tags: columns数据dataframeindexratenpnanarray
1条回答
网友
1楼 · 发布于 2024-09-22 20:37:20

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

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

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

相关问题 更多 >