Вопрос или проблема
Я хотел бы сравнить NEW_PRICE
с LINE_TOTAL_ALLOWED
на основе PROC_CODE
. Идеально, если Pandas начнет с первой строки, сопоставит PROC_CODE
и PROC_CODE_NEW
, затем вычтет NEW_PRICE
из LINE_TOTAL_ALLOWED
и выведет разницу в новом столбце PRICE_DIFFERENCE
.
Я получаю такую ошибку в Python:
" raise ValueError(ValueError: Length of values (3) does not match length of
index (920776)"
Буду признателен за любую помощь.
Вот что у меня есть на данный момент, и это вызывает вышеуказанную ошибку:
for value in df[['PROC_CODE', 'LINE_TOTAL_ALLOWED']].items():
df['price_difference'] = np.where(df['LINE_TOTAL_ALLOWED'] == ((df['NEW_PRICE'])*15)), 0, df['LINE_TOTAL_ALLOWED'] - ((df['NEW_PRICE'])*15)
Если вы еще этого не сделали, вы можете сопоставить все значения построчно, которых у вас еще нет, как 1 PROC_CODE
и 1 PROC_CODE_NEW
для каждой строки в вашем df
в качестве предварительного шага, и затем вы сможете выполнить ваши вычисления.
Например:
df = df.merge(df_other['PROC_CODE', 'PROC_CODE_NEW'], left_on='key_column_name', right_on='key_column_name')
Затем вы можете заполнить новое значение, например, применив лямбда-функцию и назначив результат новому столбцу:
def your_logic(row):
# Assign new price based on row['PROC_CODE'], ...
df['result'] = df.apply(lambda x: your_logic(x), axis=1)
Ссылка на ваше изображение не работает.
Пожалуйста, предоставьте минимальный пример, чтобы можно было дать точный кодовый ответ, потому что в таком виде трудно понять, в каком формате ваши данные.
Ответ или решение
Сравнение столбцов неравной длины в Python/Pandas
При работе с данными в Pandas часто возникает необходимость сравнивать данные из столбцов различных таблиц (или внутри одной таблицы), где строки могут не быть равномерно заполнены. На примере задачи сравнения значений столбцов NEW_PRICE
и LINE_TOTAL_ALLOWED
на основе значения PROC_CODE
, попробуем рассмотреть, как это можно реализовать в Python с использованием библиотеки Pandas.
Проблема
Вы столкнулись с ошибкой:
ValueError: Length of values (3) does not match length of
index (920776)
Это может произойти, когда вы пытаетесь создать или модифицировать столбец, где длина данных, которые вы хотите вставить, не соответствует количеству строк в DataFrame. Ваш текущий код использует метод np.where
, который, очевидно, работает некорректно в данном контексте.
Решение
Чтобы корректно выполнять сравнение столбцов разной длины, необходимо использовать методы объединения и применения функций. Мы предлагаем следующий подход:
-
Объединение DataFrame: Можно использовать метод
merge
, чтобы объединить DataFrame по ключевым колонкамPROC_CODE
иPROC_CODE_NEW
. -
Расчет ценовой разницы: После объединения данных добавьте новый столбец с разницей между
NEW_PRICE
иLINE_TOTAL_ALLOWED
.
Шаги реализации
import pandas as pd
import numpy as np
# Предположим, у вас два DataFrame: df и df_other
# df содержит столбцы: PROC_CODE, NEW_PRICE
# df_other содержит столбцы: PROC_CODE_NEW, LINE_TOTAL_ALLOWED
# Пример объединения данных по PROC_CODE
df_merged = pd.merge(df, df_other, how='left', left_on='PROC_CODE', right_on='PROC_CODE_NEW')
# Вычисление разницы и создание нового столбца с использованием lambda-функции
df_merged['PRICE_DIFFERENCE'] = df_merged.apply(
lambda row: row['LINE_TOTAL_ALLOWED'] - row['NEW_PRICE'] if pd.notnull(row['LINE_TOTAL_ALLOWED']) else np.nan,
axis=1
)
# Посмотреть результат
print(df_merged[['PROC_CODE', 'NEW_PRICE', 'LINE_TOTAL_ALLOWED', 'PRICE_DIFFERENCE']])
Основные моменты
-
Объединение: Используйте
pd.merge
для соединения двух таблиц на основе общего столбца. Это позволит сопоставить соответствующие строки перед выполнением вычислений. -
Функция
apply
: После этого используйтеapply()
с функцией lambda для вычисления разницы в новой колонке. Это позволит обработать каждую строку индивидуально и избежать проблем с размерностью. -
Безопасность данных: Убедитесь, что все используемые данные проверяются на наличие
NaN
значений, чтобы избежать проблем с арифметическими расчетами.
Ваш код будет более стабилен и понятен, если через объединение таблиц вы сможете обеспечить необходимость корректного вычисления разнице — так вы минимизируете ошибки размера и несоответствий данных.