所以我有一個超過 2000 行的 python DataFrame,其中有一些資料:它看起來像這樣:
| 指數 | 日期 | 產品 | 資料1 | 資料2 |
|---|---|---|---|---|
| 0 | 2021-11-01 | 一個 | 5 | 8 |
| 1 | 2021-11-01 | C | 2 | 0 |
| 2 | 2021-11-01 | D | 3 | 0 |
| 3 | 2021-11-02 | 一個 | 5 | 3 |
| 4 | 2021-11-02 | 乙 | 6 | 4 |
| 5 | 2021-11-03 | 一個 | 10 | 8 |
| 6 | 2021-11-03 | 乙 | 1 | 5 |
| 7 | 2021-11-03 | C | 3 | 8 |
| 8 | 2021-11-03 | D | 0 | 5 |
| 9 | 2021-11-04 | 一個 | 2 | 9 |
當“Data1”和“Data2”都為 0 時,資料沒有行。我想要做的是“填補空白”,因此資料框對于每個資料和產品名稱配對都有單獨的行,如下所示:
| 指數 | 資料 | 產品 | 資料1 | 資料2 |
|---|---|---|---|---|
| 0 | 2021-11-01 | 一個 | 5 | 8 |
| 1 | 2021-11-01 | 乙 | 0 | 0 |
| 2 | 2021-11-01 | C | 2 | 0 |
| 3 | 2021-11-01 | D | 3 | 0 |
| 4 | 2021-11-02 | 一個 | 5 | 3 |
| 5 | 2021-11-02 | 乙 | 6 | 4 |
| 6 | 2021-11-02 | C | 0 | 0 |
| 7 | 2021-11-02 | D | 0 | 0 |
| 8 | 2021-11-03 | 一個 | 10 | 8 |
| 9 | 2021-11-03 | 乙 | 1 | 5 |
| 10 | 2021-11-03 | C | 3 | 8 |
| 11 | 2021-11-03 | D | 0 | 5 |
| 12 | 2021-11-04 | 一個 | 2 | 9 |
| 13 | 2021-11-04 | 乙 | 0 | 0 |
| 14 | 2021-11-04 | C | 0 | 0 |
| 15 | 2021-11-04 | D | 0 | 0 |
我正在考慮在 for 回圈中執行此操作,但可能有一種方法可以避免這種情況。有人對更優雅的方法有任何想法嗎?
uj5u.com熱心網友回復:
正如 Christophe 所提到的,您可以創建一個時間序列(或 Date 列的所有唯一值)并將其與所有(唯一)產品交叉連接。然后您可以將其與原始資料框合并并用 0 填充 na:
products = df[['Product']].drop_duplicates().sort_values('Product')
dates = df[['Date']].drop_duplicates()
dates.merge(products, how='cross').merge(df, on=['Date','Product'], how='left').fillna(0)
對于日期date_range,如果還缺少日期,您也可以使用:
pd.date_range(df.Date.min(), df.Date.max())
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/409488.html
標籤:
下一篇:有條件地洗掉每個子集的一行
