首页 > 解决方案 > Pandas:使用 Numpy 矢量化添加列?

问题描述

我正在尝试从 Pandas 复制以下逻辑,但使用 Numpy 矢量化。

另外,我觉得可能有一种更 Pythonic 的方式来添加Actual Available列,而无需先创建两个单独的变量series_1series_2而且这并不冗长。

背后的逻辑[Actual Available]是,

有任何想法吗?

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)

标签: pythonpandasnumpydataframe

解决方案


从您的初始 DataFrame 开始,所有这些逻辑似乎都是添加到“Stock”列的“Requirements” groupby+ cumsum“Receipts”,因为“Stock”已经在整个组中重复。

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所以它已经被优化了很多。


推荐阅读