[英]Count Change in State For Each Group in Pandas DataFrame
我有包含產品的 Pandas 數據框,它是 state 以及其他信息。 可以按如下方式創建示例數據框
data = {'Product':['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C'],
'Date' : ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04','2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06', '2020-01-01', '2020-01-02'],
'Price':[10, 20, 30, 40, 15, 25, 35, 45, 55, 65, 101, 102],
'state':[1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1] }
test = pd.DataFrame(data)
我想計算產品 state 從 0 變為 1 的次數。我使用以下代碼檢查產品 state 是否從 0 變為 1 並將其命名為 change
test['change'] = np.where(test.state < test.state.shift(-1), 1, 0)
問題是上面的代碼沒有考慮產品,因此我需要按產品分組,然后檢查 state 中的更改。
Output:
+---------+----------+-------+-------+--------+
| Product | Date | Price | state | change |
+---------+----------+-------+-------+--------+
| A | 1/1/2020 | 10 | 1 | 0 |
| A | 1/2/2020 | 20 | 0 | 1 |
| A | 1/3/2020 | 30 | 1 | 0 |
| A | 1/4/2020 | 40 | 0 | 1 |
| B | 1/1/2020 | 15 | 1 | 0 |
| B | 1/2/2020 | 25 | 0 | 0 |
| B | 1/3/2020 | 35 | 0 | 1 |
| B | 1/4/2020 | 45 | 1 | 0 |
| B | 1/5/2020 | 55 | 0 | 1 |
| B | 1/6/2020 | 65 | 1 | 0 |
| C | 1/1/2020 | 101 | 0 | 1 |
| C | 1/2/2020 | 102 | 1 | 0 |
+---------+----------+-------+-------+--------+
從上面的 output 中可以看出,產品 A 在第 4 天的change
為 1,因為在下一個日期state
為 1,但這是針對不同的產品。
所需的 Output:
+---------+----------+-------+-------+--------+
| Product | Date | Price | state | change |
+---------+----------+-------+-------+--------+
| A | 1/1/2020 | 10 | 1 | 0 |
| A | 1/2/2020 | 20 | 0 | 1 |
| A | 1/3/2020 | 30 | 1 | 0 |
| A | 1/4/2020 | 40 | 0 | 0 |
| B | 1/1/2020 | 15 | 1 | 0 |
| B | 1/2/2020 | 25 | 0 | 0 |
| B | 1/3/2020 | 35 | 0 | 1 |
| B | 1/4/2020 | 45 | 1 | 0 |
| B | 1/5/2020 | 55 | 0 | 1 |
| B | 1/6/2020 | 65 | 1 | 0 |
| C | 1/1/2020 | 101 | 0 | 1 |
| C | 1/2/2020 | 102 | 1 | 0 |
+---------+----------+-------+-------+--------+
+---------+------------+
| Product |count_change|
+---------+------------+
| A | 1 |
| B | 2 |
| C | 1 |
+---------+------------+
如何調整代碼以便在基於產品分組后計算change
,並且我可以獲得 state 從 0 變為 1 的次數的產品明智計數。
嘗試分組:
g = test.groupby('Product')
test['change'] = (g['state'].diff(-1)<0).astype(int)
g['change'].sum()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.