我在這里看到了其他關于如何在 pivot() 將日期作為列名時正確對列進行排序的評論。我沒有看到的是如何在排序后將這些日期轉換為我想要的格式。
這是我的例子。我有看起來像這樣的資料:
| 類別 | 日期 | 值1 | 值2 |
|---|---|---|---|
| 一個 | 12/1/2018 | 1 | 25 |
| 一個 | 1/1/2019 | 2 | 26 |
| 一個 | 2/1/2019 | 3 | 27 |
| 乙 | 12/1/2018 | 4 | 28 |
| 乙 | 1/1/2019 | 5 | 29 |
| 乙 | 2/1/2019 | 6 | 30 |
| C | 12/1/2018 | 7 | 31 |
| C | 1/1/2019 | 8 | 32 |
| C | 2/1/2019 | 9 | 33 |
我想要的是這樣的:
| 類別 | 價值 | 12 月 18 日 | 1 月 19 日 | 2 月 19 日 |
|---|---|---|---|---|
| 一個 | 值1 | 1 | 2 | 3 |
| 一個 | 值2 | 25 | 26 | 27 |
| 乙 | 值1 | 4 | 5 | 6 |
| 乙 | 值2 | 28 | 29 | 30 |
| C | 值1 | 7 | 8 | 9 |
| C | 值2 | 31 | 32 | 33 |
我已經想出了如何讓樞軸一次執行一個值,并且只要我不嘗試格式化它們就可以對日期進行排序。但是pivot 正在將這些日期轉換為文本,因此我無法再更改格式。
這是我到目前為止:
#df['date'] = pd.to_datetime(df.date).dt.strftime('%b-%y') final = df.pivot(index='category', columns='date', values='值 1')
如果我先進行日期格式化,則排序不正確。我也嘗試過 pivot_table 但它不會讓我設定aggfunc=None。
日期格式必須是動態的,也就是每個月的日期范圍都會有所不同(過去 12 個月),所以我不想對日期進行硬編碼。
謝謝!
uj5u.com熱心網友回復:
這可能不是最干凈的解決方案。
這是我用來重現您已有內容的代碼:
import pandas as pd
df = pd.DataFrame({
"category":["a","a","a","b","b","b","c","c", "c"],
"date":["12/1/2018", "1/1/2019", "2/1/2019", "12/1/2018", "1/1/2019",
"2/1/2019", "12/1/2018", "1/1/2019", "2/1/2019"],
"value1": [1,2,3,4,5,6,7,8,9],
"value2":[25,26,27,28,29,30,31,32,33],
})
df["date"] = pd.to_datetime(df["date"]).dt.strftime("%b-%y")
然后,您可以通過以下方式接近您的期望pandas.DataFrame:
df = df.pivot(index="date", columns="category") # rows are `date` and columns are `value-category` pairs
df = df.unstack() # Bring back `value1` and `value2` as an index
df = df.reset_index("date") # `date` was an index, we bring it back as a column
df = df.pivot(columns="date") # Use pandas.DataFrame.pivot() once more to pivot on `date`
df = df.sort_values(by="category") # Sort output as shown in your desired `pandas.DataFrame`
結果是pandas.DataFrame:
0
date Dec-18 Feb-19 Jan-19
category
value1 a 1 3 2
value2 a 25 27 26
value1 b 4 6 5
value2 b 28 30 29
value1 c 7 9 8
value2 c 31 33 32
uj5u.com熱心網友回復:
我在一位同事的幫助下弄清楚了這一點。
df2= df.pivot(index="date", columns="category")
df2= df2.unstack()
df2= df2.reset_index("date")
df2= df2.pivot(columns="date")
df2= df2.sort_values(by="category")
df2.columns = df2.columns.set_levels(summary2.columns.levels[1].strftime('%Y-%b-%d'), level='date')
這種日期格式并不完全符合我的要求,但它比原始格式更有效且看起來更好。
df2= df2.droplevel(level=0, axis=1)
df2.columns = [''.join(col).strip() for col in df2.columns.values]
df2.columns = summary2.columns.get_level_values(0)
該表最終看起來像這樣:
| 類別 | 2018-12-1 | 2019-Jan-1 | 2019 年 2 月 1 日 | |
|---|---|---|---|---|
| 值1 | 一個 | 1 | 2 | 3 |
| 值2 | 一個 | 25 | 26 | 27 |
| 值1 | 乙 | 4 | 5 | 6 |
| 值2 | 乙 | 28 | 29 | 30 |
| 值1 | C | 7 | 8 | 9 |
| 值2 | C | 31 | 32 | 33 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/393281.html
