【发布时间】:2020-04-06 20:06:48
【问题描述】:
我正在尝试根据列的 dtypes 比较两个 Pandas DataFrame。这些是场景:
- 如果 dtype 是 'object',第一个 df 中的每个数据条目都需要与第二个 df 中的相应条目完全匹配
- 如果 dtype 是“float”或“int”,它们需要彼此靠近
这是我目前所拥有的:
for column in data_1.columns:
if df_1[column].dtypes == 'float' or df_1[column].dtypes == 'int':
comparison[column] = np.isclose(df_1[column], df_2[column])
else:
comparison[column] = df_1[column].where(df_1[column].values == df_2[column].values).notna()
但是,在我的比较数据框中,我得到了很多误报,即两列中的值相同时,我的比较数据框中有“假”。 为了测试这一点,我打印了一些显示为假的数据点的减法,结果为 0,这是预期的:
print(np.isclose(df_1[df_1['id']=='72']['cad'], df_2[df_2['id']=='72']['cad']))
print(df_1[df_1['id']=='72']['cad'] - df_2[df_2['id']=='72']['cad'])
谁能帮我理解我在哪里搞砸了?
编辑: 由于我无法分享我正在使用的数据,我整理了一个迷你示例,其中包含了我正在执行的所有步骤并获得了预期的结果:
import numpy as np
import pandas as pd
df1 = pd.DataFrame(np.array([['a', ''], ['b', '2.0'], ['c', '3.01']]),columns=['id', 'value'])
df1['value'] = pd.to_numeric(df1['value'], errors='coerce')
df2 = pd.DataFrame(np.array([['a', ''], ['b', '2.0'], ['c', '3.0']]),columns=['id', 'value'])
df2['value'] = pd.to_numeric(df2['value'], errors='coerce')
comparison = pd.DataFrame(columns=['id', 'value'])
for column in df1.columns:
if df1[column].dtypes == 'float' or df1[column].dtypes == 'int':
comparison[column] = np.isclose(df1[column], df2[column], equal_nan=True, atol=0.01, rtol=0.01)
else:
comparison[column] = df1[column].where(df1[column].values == df2[column].values).notna()
print(comparison.head())
经过更多调查,我发现这是由于我排序的原始数据集中缺少 id 造成的。
【问题讨论】:
-
请分享一些示例输入和预期输出。