Pandas pivot_table(~)
方法將輸入DataFrame轉換為所謂的數據透視表。數據透視表的概念最好通過示例來解釋,因此請在下麵查看它們。
參數
1. data
| DataFrame
用於創建數據透視表的 DataFrame。
2. values
| string
或 list<string>
| optional
其值將填充生成的數據透視表的列的標簽。這些值將使用指定的 aggfunc
進行聚合,這僅意味著我們計算統計量(例如總和、平均值、最大值等)來匯總這些值。
3. index
| string
或 list<string>
| optional
將成為結果數據透視表索引的列的標簽。
4. aggfunc
| function
或 list<function>
| optional
用於聚合值的函數。默認情況下,aggfunc=np.mean
。
5. fill_value
| scalar
| optional
要替換 NaN
的值。默認情況下,fill_value=None
。
6. margins
| boolean
| optional
是否添加顯示值總和的新行和列。默認情況下,margins=False
。
7. dropna
| boolean
| optional
是否刪除帶有 NaN
的條目。默認情況下,dropna=True
。
8. margins_name
| string
| optional
分配給包含值總和的新行和列的標簽。這僅在 margins=True
時相關。默認情況下,margins_name="All"
。
返回值
代表數據透視表的新DataFrame。
例子
基本用法
考慮以下關於員工收到的獎金的DataFrame:
df = pd.DataFrame({"name":["alice","alice","bob","alice","bob","bob"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20]})
df
name year bonus
0 alice 2012 10
1 alice 2012 15
2 bob 2012 15
3 alice 2013 10
4 bob 2013 10
5 bob 2013 20
我們的目標是計算每位員工每年的獎金總額。我們可以通過創建所謂的數據透視表使用pivot_table(~)
方法:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)
year 2012 2013
name
alice 25 10
bob 15 30
請注意以下事項:
-
bonus
列的值用於填充生成的 DataFrame。 -
name
列被指定為新索引。 -
year
列的值(2012
和2013
)成為新的列標簽。 -
aggfunc
是求和,如 NumPy 的sum(~)
方法所示。
多重聚合
我們還可以一次計算多個聚合。除了總和之外,我們還計算每個員工每年的平均獎金:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=[np.sum, np.mean])
sum mean
year 2012 2013 2012 2013
name
alice 25 10 12.5 10.0
bob 15 30 15.0 15.0
請注意我們如何必須在此處傳遞 aggfunc
的聚合函數列表。
多個值
假設這次我們要聚合兩列。為了證明這一點,這裏有一個 DataFrame,其中有一個新列,指示每個員工每年缺勤的天數:
df = pd.DataFrame({"name":["alice","alice","bob","alice","bob","bob"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20], "days_absent":[1,2,5,2,3,5]})
df
name year bonus days_absent
0 alice 2012 10 1
1 alice 2012 15 2
2 bob 2012 15 5
3 alice 2013 10 2
4 bob 2013 10 3
5 bob 2013 20 5
要計算每位員工的獎金總額以及每年的缺勤天數:
pd.pivot_table(df, values=["bonus","days_absent"], index="name", columns="year", aggfunc=np.sum)
bonus days_absent
year 2012 2013 2012 2013
name
alice 25 10 3 2
bob 15 30 5 8
請注意我們如何在此處傳遞 values
的列標簽數組。
多重指數
假設我們想使用兩列作為結果 DataFrame 的索引。為了證明這一點,這裏有一個DataFrame,其中員工現在通過名字和姓氏進行標識:
df = pd.DataFrame({"first_name":["alice","alice","bob","alice","bob","bob"], "last_name":["A","B","A","A","A","B"], "year":[2012,2012,2012,2013,2013,2013], "bonus":[10,15,15,10,10,20]})
df
first_name last_name year bonus
0 alice A 2012 10
1 alice B 2012 15
2 bob A 2012 15
3 alice A 2013 10
4 bob A 2013 10
5 bob B 2013 20
現在,alice A
和 alice B
代表兩名不同的員工,因此在計算每位員工每年的總獎金時區分他們是有意義的。我們通過傳入 index
參數的列表來完成此操作:
pd.pivot_table(df, values=["bonus"], index=["first_name", "last_name"], columns="year", aggfunc=np.sum)
bonus
year 2012 2013
first_name last_name
alice A 10.0 10.0
B 15.0 NaN
bob A 15.0 10.0
B NaN 20.0
我們在2013
中得到alice B
的總獎金NaN
,因為它在df
中不存在。
填充缺失值
考慮以下 DataFrame :
df = pd.DataFrame({"name":["alice","bob","bob"], "year":[2012,2012,2013], "bonus":[10,15,20]})
name year bonus
0 alice 2012 10
1 bob 2012 15
2 bob 2013 20
請注意,我們在 2013
中沒有有關 Alice 獎金的數據。
默認情況下,缺失值將在生成的數據透視表中由 NaN
指示:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)
year 2012 2013
name
alice 10.0 NaN
bob 15.0 20.0
我們可以選擇通過傳入fill_value
參數來用我們自己的值填充這些NaN
:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, fill_value=-1)
year 2012 2013
name
alice 10 -1
bob 15 20
指定邊距和margins_name
考慮以下 DataFrame :
df = pd.DataFrame({"name":["alice","bob","alice","bob"], "year":[2012,2012,2013,2013], "bonus":[10,15,20,30]})
df
name year bonus
0 alice 2012 10
1 bob 2012 15
2 alice 2013 20
3 bob 2013 30
通過設置 margins=True
,我們獲得額外的行和列來保存值的總和:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, margins=True)
year 2012 2013 All
name
alice 10 20 30
bob 15 30 45
All 25 50 75
請注意以下事項:
-
行總和告訴我們每個員工獲得的獎金總額
-
該列總和是所有員工每年賺取的獎金總額
-
右下角的條目告訴我們所有員工在 2 年內獲得的獎金總額
默認情況下,這些新引入的行和列被分配標簽 "All"
。我們可以使用 margins_name
參數分配我們自己的標簽:
pd.pivot_table(df, ~~~, margins=True, margins_name="Total")
year 2012 2013 Total
name
alice 10 20 30
bob 15 30 45
Total 25 50 75
指定 dropna
考慮以下 DataFrame :
df = pd.DataFrame({"name":[np.NaN,np.NaN,"alice","bob"], "year":[2012,2012,2013,2013], "bonus":[10,15,20,25]})
df
name year bonus
0 NaN 2012 10
1 NaN 2012 15
2 alice 2013 20
3 bob 2013 25
在這裏,我們缺少 2012
年員工的姓名。這意味著生成的數據透視表將具有與 2012
對應的列,並填充 NaN
。
默認情況下, dropna=True
,這意味著生成的數據透視表中條目全部為 NaN
的列將被刪除:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum)
year 2013
name
alice 20
bob 25
我們可以通過設置dropna=False
來選擇保留NaN
,如下所示:
pd.pivot_table(df, values="bonus", index="name", columns="year", aggfunc=np.sum, dropna=False)
year 2012 2013
name
alice NaN 20
bob NaN 25
相關用法
- Python Pandas pivot方法用法及代碼示例
- Python pandas.arrays.IntervalArray.is_empty用法及代碼示例
- Python pyspark.pandas.Series.dropna用法及代碼示例
- Python pyspark.pandas.groupby.SeriesGroupBy.unique用法及代碼示例
- Python pandas.DataFrame.ewm用法及代碼示例
- Python pandas.api.types.is_timedelta64_ns_dtype用法及代碼示例
- Python pandas.DataFrame.dot用法及代碼示例
- Python pandas.DataFrame.apply用法及代碼示例
- Python pyspark.pandas.Series.dt.weekday用法及代碼示例
- Python pyspark.pandas.DataFrame.select_dtypes用法及代碼示例
- Python pyspark.pandas.date_range用法及代碼示例
- Python pyspark.pandas.isnull用法及代碼示例
- Python pyspark.pandas.Series.hasnans用法及代碼示例
- Python pandas.DataFrame.combine_first用法及代碼示例
- Python pyspark.pandas.Series.rmul用法及代碼示例
- Python pyspark.sql.functions.grouping_id用法及代碼示例
- Python pyspark.pandas.Series.str.repeat用法及代碼示例
- Python pyspark.pandas.DataFrame.groupby用法及代碼示例
- Python pandas.Series.iloc用法及代碼示例
- Python pyspark.ml.feature.DCT用法及代碼示例
- Python pandas.Timestamp.to_numpy用法及代碼示例
- Python pyspark.sql.functions.hours用法及代碼示例
- Python pandas.Index.value_counts用法及代碼示例
- Python pyspark.pandas.Series.add_prefix用法及代碼示例
- Python pandas.DatetimeTZDtype用法及代碼示例
注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas | pivot_table method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。