python - Pandas:使用 Numpy 矢量化添加列?
问题描述
我正在尝试从 Pandas 复制以下逻辑,但使用 Numpy 矢量化。
另外,我觉得可能有一种更 Pythonic 的方式来添加Actual Available
列,而无需先创建两个单独的变量series_1
,series_2
而且这并不冗长。
背后的逻辑[Actual Available]
是,
- 如果 [Is First?] 列是 True 那么
[Actual Available] = [Stock] + [Requirements] + [Receipts]
, - 如果 [Is First?] 列是 False 则
[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)
解决方案
从您的初始 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
所以它已经被优化了很多。
推荐阅读
- javascript - 更改事件 oninput typescript 的值
- python - 想要在折线图中设置 y 轴标签值
- python - 拒绝麦克风访问
- angular - 行正在添加,而动态列正在使用 Angular 8 添加到 Mat-Table
- javascript - 我如何包含一个数组?
- javascript - 为什么当我向下滚动时画布下方有空白
- python - 想知道 PIL liarary 中 Image.resize 操作的详细情况
- mysql - MySQL 返回列中每个值的总 COUNT
- java - java @Autowired 返回空值。不能让弹簧工作
- java - 提取素数