Панды, как заменить NaN в строках дубликатами ключей

#python #pandas

Вопрос:

У меня есть следующий фрейм данных:

 id item item_cost order_total  1 A 6 10  1 B 4 NaN  2 A 5 5  3 C 12 12  

Существуют дубликаты ключей (столбец «идентификатор»), которые относятся к определенному заказу. order_total-это сумма каждого item_cost с одинаковым идентификатором. Теперь я хотел бы скопировать order_total в каждую строку одного и того же порядка. Например, обе строки с идентификатором = 1 должны иметь order_total 10. У одного из них есть Нэн.

Этот фрейм данных просто считывается из csv, поэтому я не производил никаких вычислений ни по одному из этих столбцов.

Упрощенная логика, которую я пытаюсь достичь, такова: если идентификатор столбца является дубликатом, заполните значения NaN значением, отличным от NaN, из строки с тем же идентификатором.

Я попробовал следующий код:

 print(df.groupby('id',as_index=False).sum())  

Однако проблема здесь в том, что я теряю имя элемента, которое мне нужно использовать для дальнейшего анализа.

Комментарии:

1. печать(df.groupby(‘id’) [«order_total»].сумма()

2. @FaikaMajid — спасибо, однако это больше не позволяет мне видеть, какие товары являются частью заказа. Он выводит общую стоимость каждого заказа с одинаковым идентификатором, однако я не вижу, какие товары были частью этого заказа. Надеюсь, в этом есть смысл.

3. если фрейм данных мал, вы можете использовать для этого итерации. В этом первом используйте исходный фрейм данных и выполните запрос к этому фрейму данных, где order_total равен nan,. Затем повторите оба и проверьте, совпадает ли идентификатор, поместите значение порядка во 2-й порядок кадров данных

Ответ №1:

Попробуй это:

 df['order_total'] = df.groupby('id').order_total.transform('first')  print(df)   id item item_cost order_total 0 1 A 6 10.0 1 1 B 4 10.0 2 2 A 5 5.0 3 3 C 12 12.0  

Комментарии:

1. отлично, спасибо, это сработало именно так, как ожидалось! Я никогда не видел функцию .transform, поэтому почитаю о ней, чтобы понять, что она делает.

2. Рад, что это сработало! Возможно, я отредактировал ответ, пока вы его пробовали. Я сделал несколько ненужных операций перед редактированием.