[英]How to convert rows to columns in a Pandas groupby?
我有一個包含一組產品超過 6 個月的價格數據的表格。 每個產品都有一個唯一的 id (sku_id),尺寸范圍為 6-12。 我們每天測量價格,並生成類似於以下示例的表格。 來源表示價格在哪個網站上(可以是 1-4)。
| sku_id | size | price | timestamp | source |
| 1 | 6.0 | 115.0 | 2021-01-10| 1 |
| 2 | 8.0 | 149.0 | 2021-01-10| 1 |
| 1 | 6.0 | 168.0 | 2021-01-10| 2 |
| 1 | 9.0 | 152.0 | 2021-01-10| 1 |
...
| 1 | 9.0 | 152.0 | 2021-07-10| 1 |
現在,我想對上述數據集執行一些分析/建模,但我無法根據需要對其進行格式化。 我希望每個站點的每個產品都有一行(即鍵是 [sku_id, size, source]),我們在新列中獲取從 1 月 10 日到 7 月 1 日每天的價格。 這在下表中表示。
| sku_id | size | source |price on 2021-01-10|price on 2021-01-11|price on 2021-01-12| ... |
| 1 | 6.0 | 1 | 149.0 | 151.2 | 158.2 | ... |
| 2 | 6.0 | 1 | 142.0 | 221.8 | 312.9 | ... |
...
我正在嘗試使用 group by(按 sku_id、size 和 source 分組)在 Pandas 中執行此操作,但我不確定如何指示 Pandas 每天添加一個新列。 有沒有人有關於如何從第一個表構建第二個表的說明/建議? 我不太確定如何讓小組繼續工作,我也不知道還有什么其他策略可以奏效。
使用數據pivot
轉換您的數據框:
# pivot args: 1st -> index, 2nd -> columns, 3rd -> values
>>> df.pivot(['sku_id', 'size', 'source'], 'timestamp', 'price') \
.rename_axis(columns=None).add_prefix('price on ').reset_index()
sku_id size source price on 2021-01-10 price on 2021-07-10
0 1 6.0 1 115.0 NaN
1 1 6.0 2 168.0 NaN
2 1 9.0 1 152.0 152.0
3 2 8.0 1 149.0 NaN
我認為您的預期輸出不正確。 值 149 附加到sku_id = 2
而這在預期輸出中標記在sku_id = 1
下。 它將一些值從觀察值移動到另一個值。
而不管:
>>> df.set_index(['sku_id', 'size', 'source', 'timestamp']).unstack()
price
timestamp 2021-01-10 2021-07-10
sku_id size source
1 6.0 1 115.0 NaN
2 168.0 NaN
9.0 1 152.0 152.0
2 8.0 1 149.0 NaN
然后減少你的柱狀多索引: df.columns = [' '.join(col).strip() for col in df.columns.values]
得到price 2021-01-10
等。如果你想要不同的形式,格式化它以適應。
如果你想要重復的東西, reset_index
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.