Я пытаюсь сравнить два Pandas кадра данных на основе dtypes столбцов. Это сценарий ios:
- Если dtype является «объектом», каждая запись данных в первом 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())
После дополнительного расследования я обнаружил, что это было вызвано отсутствием идентификаторов в исходных наборах данных, по которым я сортировал.