Pandas сгруппировать несколько столбцов и сохранить все остальные столбцы - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть df, который является concat из двух идентично структурированных df, первый - Orders, а второй - Cancels. В Orders есть более 20000 строк и небольшое число Cancels, которые имеют OrderNo & ItemCode. Я сделал отмененные количества отрицательными, чтобы при группировке df по OrderNo и ItemCode я мог суммировать поля количества с agg, что дает мне фактическое количество отгруженных товаров, которое компенсирует отмененные заказы.

Ниже приводится мой фрейм данных:

    OrderNo     OrderDate   LineNo  ClientNo    ItemCode    QtyOrdered  QtyShipped
0   528758  1/3/2017    1   1358538     111931  70  70
1   528791  1/3/2017    10  1254798     110441  300     300
2   528791  1/3/2017    1   1254798     1029071     10  10
3   528791  1/3/2017    2   1254798     1033341     10  10
4   528791  1/3/2017    8   1254798     1040726     15  15
...     ...     ...     ...     ...     ...     ...     ...
28344   537667  2/6/2017    12  43823870    10137992    0   -2
28345   537771  2/7/2017    5   1276705     1041106     0   -4
28346   539524  2/13/2017   6   1254798     1038323     0   -10
28347   542362  2/23/2017   11  1254612     1041108     0   -2
28348   542835  2/23/2017   13  1255235     10137993    0   -5

28349 rows × 7 columns

После запуска:

ActualOrders = PreActualOrders.groupby(['OrderNo','ItemCode']).agg({'QtyOrdered': 'sum', 'QtyShipped': 'sum'}).reset_index()

Я получаю желаемый результат, но я теряю все остальные столбцы в DF.

Пример результата ниже:

    OrderNo     ItemCode    QtyOrdered  QtyShipped
28255   543734  1038324     1   1
28256   543734  10137992    1   1
28257   543734  10137993    1   1
28258   543735  1041106     1   1
28259   543735  1041108     1   1
28260   543735  10135359    1   1

Что мне нужно добавить, чтобы все столбцы были в исходном df?

Все значения в этих других столбцах совпадают, так как они соответствуют отменам или порядку.

Спасибо,

MTH

1 Ответ

0 голосов
/ 22 апреля 2020

Если я вас правильно понял, вы могли бы попробовать другой подход без групповой работы. Нечто похожее на это:

orders = [["123", "1", 10], ["1234", "2", 100], ["12345", "3", 15]]
cancels = [["123", "1", 10]]

df_orders = pd.DataFrame(orders, columns=["OrderNo", "ItemCode", "Amount"])
df_cancels = pd.DataFrame(cancels, columns=["OrderNo", "ItemCode", "Amount"])

merged = df_orders.merge(df_cancels, how="left", on=["OrderNo", "ItemCode"], suffixes=["_orders", "_cancels"])
merged["Amount_cancels"] = merged["Amount_cancels"].fillna(0)
print("Before substract cancels")
print(merged)

merged["Amount_orders"] = merged["Amount_orders"] - merged["Amount_cancels"]
print("After substract cancels")
print(merged)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...