簡體   English   中英

如何將 Pandas groupby 中的行轉換為列?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM