Сравнение двух Pandas фреймов данных - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь сравнить два Pandas кадра данных на основе dtypes столбцов. Это сценарий ios:

  1. Если dtype является «объектом», каждая запись данных в первом df должна точно соответствовать соответствующей записи во втором df
  2. Если 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())

После дополнительного расследования я обнаружил, что это было вызвано отсутствием идентификаторов в исходных наборах данных, по которым я сортировал.

1 Ответ

1 голос
/ 07 апреля 2020

У меня это работает на простом примере с игрушкой, надеюсь, это сработает и у вас. Я установил atol на 0,1, чтобы 3-й элемент b был достаточно близко (True), а 2-й элемент был слишком далеко (False)

df1 = pd.DataFrame({'a': list('abcd'), 'b': [1, 2, 3, 4]})
df2 = pd.DataFrame({'a': list('ab3d'), 'b': [1, 20.3, 3.05, 4]})
comparison = pd.DataFrame()

for col in df1.columns: 
    if df1[col].dtypes in ["int", "float"]:
        comparison[col] = np.isclose(df1[col], df2[col], atol=0.1)
   else: 
        comparison[col] = df1[col] == df2[col]
comparison 
       a      b
0   True   True
1   True  False
2  False   True
3   True   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...