Pandas: Добавить столбец, используя Numpy векторизация? - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь повторить следующие логи c из Pandas, но использую Numpy векторизацию.

Кроме того, я чувствую, что может быть более Pythoni c способ добавления * Столбец 1003 * без создания сначала двух отдельных переменных series_1 и series_2, а также не многословных.

Лог c, стоящий за [Actual Available],

  • если столбец [Первый?] истинен, то [Actual Available] = [Stock] + [Requirements] + [Receipts],
  • если столбец [Первый?] ложен, то [Actual Available] = [Prev row of Actual Available] + [Requirements] + [Receipts]

Есть идеи?

import pandas as pd
import numpy as np

df = pd.DataFrame({
    "Material": ["ABC", "ABC", "ABC", "ABC", "XYZ", "XYZ", "XYZ"],
    "Plant": [2685, 2685, 2685, 2685, 2685, 2685, 2685],
    "Year": ["2020", "2020", "2020", "2020", "2020", "2020", "2020"],
    "Week": [1, 2, 3, 4, 1, 2, 3],
    "Stock": [30, 30, 30, 30, 70, 70, 70],
    "Requirements": [10, 15, 20, 25, 20, 30, 40],
    "Receipts": [1, 2, 3, 4, 11, 12, 13]
})

print(df)

# Add [Is First?] column
df["Is First?"] = np.where(
    (df["Material"] == df["Material"].shift(1)) &
    (df["Plant"] == df["Plant"].shift(1)),
    False,
    True,
)

# Add [Actual Available] column
df["Actual Available"] = (df["Stock"] + df["Requirements"] +
                          df["Receipts"]).where(df["Is First?"].eq(True))

series_1 = df["Is First?"].eq(True).cumsum()
series_2 = (df["Actual Available"].ffill() +
            (df["Receipts"] +
             df["Requirements"]).shift(-1).groupby(series_1).cumsum().shift())

df["Actual Available"] = df["Actual Available"].fillna(series_2)

print(df)

1 Ответ

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

Начиная с вашего исходного DataFrame, все эти логи c кажутся groupby + cumsum из «Требования» + «Квитанции», добавленные в столбец «Акции», поскольку «Акция» уже повторяется на протяжении всего group.

df["Actual Available"] = df['Stock'] + df.groupby(['Material', 'Plant'])[['Requirements', 'Receipts']].cumsum().sum(1)

  Material  Plant  Year  Week  Stock  Requirements  Receipts  Actual Available
0      ABC   2685  2020     1     30            10         1                41
1      ABC   2685  2020     2     30            15         2                58
2      ABC   2685  2020     3     30            20         3                81
3      ABC   2685  2020     4     30            25         4               110
4      XYZ   2685  2020     1     70            20        11               101
5      XYZ   2685  2020     2     70            30        12               143
6      XYZ   2685  2020     3     70            40        13               196

В терминах "векторизации" pandas построен на numpy, поэтому производительность налицо. Кроме того, pandas делает все возможное для множества операций. DataFrame.GroupBy.cumsum() имеет ускоренную дорожку, реализованную в cython, поэтому она уже была оптимизирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...