Бывают случаи, когда вы работаете с более чем одним Pandas DataFrames, и вам может потребоваться сравнить их значения. Давайте создадим два фрейма данных, а затем сравним значения. Создайте два фрейма данных с помощью словаря Python, а затем сравните их значения.
Шаг 1. Подготовьте два фрейма данных Pandas
Как мы обсуждали выше, мы создадим два кадра данных, используя словари.
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import pandas as pd dictA = {'phone': ['Samsung S20', 'iPhone 11', 'Reliance Jio'], 'price': [1000, 1100, 100]} dictB = {'mobile': ['Samsung S21', 'iPhone 12', 'Reliance'], 'mrp': [1100, 1500, 100]} dfA = pd.DataFrame(dictA) dfB = pd.DataFrame(dictB) print('First DataFrame') print(dfA) print('-----------------') print('Second DataFrame') print(dfB) |
Выход:
|
1 2 3 4 5 6 7 8 9 10 11 |
First DataFrame phone price 0 Samsung S20 1000 1 iPhone 11 1100 2 Reliance Jio 100 ----------------- Second DataFrame mobile mrp 0 Samsung S21 1100 1 iPhone 12 1500 2 Reliance 100 |
Сначала мы определили два словаря, а затем преобразовали эти словари в DataFrames с помощью функции pd.DataFrame(dict), и распечатали оба DataFrames.
В этом примере вы можете видеть, что Reliance Jio и Reliance имеют одинаковую цену и MRP, что равно 100. Другие значения, которые мы взяли, разные.
Шаг 2: Импорт пакета Numpy
Если вы не знаете, как установить numpy, ознакомьтесь с руководством по установке numpy в этом блоге. Вы также можете проверить установленную версию numpy.
После этого вам нужно импортировать numpy в проект, используя import numpy as np.
|
1 2 |
import pandas as pd import numpy as np |
Шаг 3: Сравните значения df, используя метод np.where()
Давайте разберемся с синтаксисом сравнения значений.
|
1 |
dfA['new column that will contain the comparison results'] = np.where(condition,'value if true','value if false') |
Во-первых, нам нужно добавить новый столбец в DataFrame, который содержит результат сравнения. Значения столбца будут либо True, либо False в зависимости от результата сравнения. Если значения совпадают, то он вернет True, иначе False.
С правой стороны мы использовали функцию Python np.where(), которая принимает условие и значения, из которых можно выбирать. Мы передали эти значения как True и False.
Теперь давайте реализуем приведенную выше формулу для нашей программы и посмотрим на результат.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import pandas as pd import numpy as np dictA = {'phone': ['Samsung S20', 'iPhone 11', 'Reliance Jio'], 'price': [1000, 1100, 100]} dictB = {'mobile': ['Samsung S21', 'iPhone 12', 'Reliance'], 'mrp': [1100, 1500, 100]} dfA = pd.DataFrame(dictA) dfB = pd.DataFrame(dictB) print('First DataFrame') print(dfA) print('-----------------') print('Second DataFrame') print(dfB) dfA['mrp'] = dfB['mrp'] dfA['matchPrice?'] = np.where(dfA['price'] == dfB['mrp'], 'True', 'False') print('-----------------') print('Add third column which tells if the prices are same or not') print(dfA) |
Выход:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
First DataFrame phone price 0 Samsung S20 1000 1 iPhone 11 1100 2 Reliance Jio 100 ----------------- Second DataFrame mobile mrp 0 Samsung S21 1100 1 iPhone 12 1500 2 Reliance 100 ----------------- Add third column which tells if the prices are same or not phone price mrp matchPrice? 0 Samsung S20 1000 1100 False 1 iPhone 11 1100 1500 False 2 Reliance Jio 100 100 True |
Вы заметите, что новый столбец (т. е. столбец «matchPrice?») будет создан под первым фреймом кадром данных (т. е. dfA). Этот новый столбец будет содержать результаты сравнения на основе следующих правил:
- Если цена равна mrp, то присваиваем значение True.
- В противном случае присвойте значение False.
Цена Reliance Jio и Reliance одинакова; поэтому он возвращает True, а остальные значения — False.
Разница между dfA price и dfB mrp
Чтобы получить разницу между ценой и mrp в качестве четвертого столбца, вам нужно написать следующий синтаксис.
|
1 |
dfA['diffPrice?'] = np.where(dfA['price'] == dfB['mrp'], 0, dfA['price'] - dfB['mrp']) |
В этом синтаксисе мы пытаемся добиться того, что если значения price и mrp совпадают, то return 0 в противном случае возвращает результат вычитания цены — mrp.
Если значения DataFrame одинаковы, то вычитание будет равно 0, а если нет, то вывод вычитания будет либо 0, либо положительным, либо отрицательным в зависимости от значений.
Полный код смотрите здесь.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import pandas as pd import numpy as np dictA = {'phone': ['Samsung S20', 'iPhone 11', 'Reliance Jio'], 'price': [1000, 1100, 100]} dictB = {'mobile': ['Samsung S21', 'iPhone 12', 'Reliance'], 'mrp': [1100, 1500, 100]} dfA = pd.DataFrame(dictA) dfB = pd.DataFrame(dictB) print('First DataFrame') print(dfA) print('-----------------') print('Second DataFrame') print(dfB) dfA['mrp'] = dfB['mrp'] dfA['matchPrice?'] = np.where(dfA['price'] == dfB['mrp'], 'True', 'False') print('-----------------') print('Add third column which tells if the prices are same or not') print(dfA) print('-----------------') print('Add fourth column which tells the difference between prices') dfA['diffPrice?'] = np.where( dfA['price'] == dfB['mrp'], 0, dfA['price'] - dfB['mrp']) print(dfA) |
Выход:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
First DataFrame phone price 0 Samsung S20 1000 1 iPhone 11 1100 2 Reliance Jio 100 ----------------- Second DataFrame mobile mrp 0 Samsung S21 1100 1 iPhone 12 1500 2 Reliance 100 ----------------- Add third column which tells if the prices are same or not phone price mrp matchPrice? 0 Samsung S20 1000 1100 False 1 iPhone 11 1100 1500 False 2 Reliance Jio 100 100 True ----------------- Add fourth column which tells the difference between prices phone price mrp matchPrice? diffPrice? 0 Samsung S20 1000 1100 False -100 1 iPhone 11 1100 1500 False -400 2 Reliance Jio 100 100 True 0 |
На выходе мы получим отрицательные значения, потому что mrp выше price, поэтому вычитание будет отрицательным, и если оба одинаковы, то мы получим 0.
ValueError: можно сравнивать только объекты серии с одинаковыми метками
Когда вы сравниваете два DataFrame Pandas, вы должны убедиться, что количество записей в первом фрейме данных соответствует количеству записей во втором. В приведенных выше примерах каждый из двух DataFrames имел 3 записи с 3 продуктами и 3 ценами.
Если, например, один из DataFrame имеет 4 продукта, а другой DataFrame — 3 продукта, и вы пытаетесь запустить сравнение, вы получите следующую ошибку.
ValueError: можно сравнивать только объекты серии с одинаковыми метками.
См. следующий код.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import pandas as pd import numpy as np dictA = {'phone': ['Samsung S20', 'iPhone 11', 'Reliance Jio', 'Moto'], 'price': [1000, 1100, 100, 500]} dictB = {'mobile': ['Samsung S21', 'iPhone 12', 'Reliance'], 'mrp': [1100, 1500, 100]} dfA = pd.DataFrame(dictA) dfB = pd.DataFrame(dictB) print('First DataFrame') print(dfA) print('-----------------') print('Second DataFrame') print(dfB) dfA['mrp'] = dfB['mrp'] dfA['matchPrice?'] = np.where(dfA['price'] == dfB['mrp'], 'True', 'False') print('-----------------') print('Add third column which tells if the prices are same or not') print(dfA) |
Выход:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
First DataFrame phone price 0 Samsung S20 1000 1 iPhone 11 1100 2 Reliance Jio 100 3 Moto 500 ----------------- Second DataFrame mobile mrp 0 Samsung S21 1100 1 iPhone 12 1500 2 Reliance 100 Traceback(most recent call last): File "app.py", line 19, in <module> dfA['matchPrice?'] = np.where(dfA['price'] == dfB['mrp'], 'True', 'False') File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/ops/common.py", line 64, in new_method return method(self, other) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pandas/core/ops/__init__.py", line 524, in wrapper raise ValueError("Can only compare identically-labeled Series objects") ValueError: Can only compare identically-labeled Series objects |
В приведенном выше примере вы можете видеть, что если один DataFrame имеет 4 строки, а другой — 3 строки, будет выдано ValueError.

В этой статье мы сравнили два фрейма данных и распечатали значения разницы между ними.
