【发布时间】: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