假設xlsx檔案部分內容如下:
具有雙層index,該如何讀取?
df = pd.read_excel(fpath, index_col=[0,1] )
如何顯示所有欄?
pd.set_option(“display.max_columns“,None)
讀進來的DataFrame:
Excel進行樞紐分析後:
Python如何使用
pandas.DataFrame.groupby()
或 pandas.pivot_table()
做出一樣的結果?
使用.groupby()
import os
import pandas as pd
folder = r”C:\Python\AWR1443BOOST\dat”
fname = “concat_df from xwr14xx_processed_stream_2023_03_03T07_52_14_957 2.dat_.xlsx”
fpath = os.path.join(folder, fname)
df = pd.read_excel(fpath)
#df = pd.read_excel(fpath,index_col=[0,1])
#其實少寫了index_col=[0,1]
#但groupby() 剛好不會出錯
groupbyIdxObj = df.groupby(‘Range Index’)
#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001C37347CE50>
# 計算數量、平均值和標準差
count = groupbyIdxObj.size()
mean_peak_value = groupbyIdxObj[‘Peak Value(DB)’].mean()
mean_phi = groupbyIdxObj[‘phi(度)’].mean()
# 合併結果
result = pd.concat([count, mean_peak_value, mean_phi], axis=1)
# 更改欄位名稱
result.columns = [‘數計數’, ‘平均值 – Peak Value(DB)’, ‘平均值 – phi(度)’]
# 輸出結果
print(result)
輸出的DataFrame:
使用 pandas.pivot_table()
import os
import pandas as pd
folder = r”C:\Python\AWR1443BOOST\dat”
fname = “concat_df from xwr14xx_processed_stream_2023_03_03T07_52_14_957 2.dat_.xlsx”
fpath = os.path.join(folder, fname)
df = pd.read_excel(fpath)
# 使用 pivot_table() 計算數量、平均值和標準差
result = pd.pivot_table(df, index=’Range Index’,
values=[‘Peak Value(DB)’, ‘phi(度)’],
aggfunc={‘Peak Value(DB)’: [‘count’, ‘mean’],
‘phi(度)’: ‘mean’})
# 更改欄位名稱
result.columns = [‘數計數’, ‘平均值 – Peak Value(DB)’, ‘平均值 – phi(度)’]
# 輸出結果
print(result)
當我們使用 pd.pivot_table() 計算重複值時,aggfunc 參數可以傳入一個字典,指定要計算每個值欄位的聚合函數,如計算平均值、總和或計數等。在這裡,我們指定 ‘Peak Value(DB)’ 欄位需要計算兩種聚合函數,分別是 ‘count’ 和 ‘mean’。
當我們在進行 pd.pivot_table() 操作時,它會自動根據 index 參數指定的列來進行聚合操作。在這裡,’Range Index’ 列是 index,因此它會將所有具有相同值的行合併在一起,並且計算每個值欄位的聚合函數。
當我們指定 ‘Peak Value(DB)’: [‘count’,’mean’] 時,pd.pivot_table() 會在計算平均值之外,也計算 ‘Peak Value(DB)’ 欄位中具有相同值的行的數量。這樣我們就可以知道每個具有相同 ‘Range Index’ 值的行出現了多少次,因此,這個方法可以用來計算 ‘Range Index’ 列中的重複值。
使用Excel樞紐分析
也可以看到
不論對Range Index, 還是Peak Value 做計數
結果都是一樣的:
輸出結果:
pivot_table()中
Range Index 不能賦值給index,
又賦值給values, aggfunc
不然會出現 ValueError: Grouper for ‘Range Index’ not 1-dimensional
很容易寫成以下:
若想用這樣的語法,
可以先複製多一欄”Range Index copied”
僅有欄標籤不一樣,
內容皆同Range Index
values=[“Range Index copied”, ‘Peak Value(DB)’, ‘phi(度)’]
但輸出結果,
沒有照values的順序(照字母順序)
前兩欄的資料必須互換
結尾有修改方式,
若順序也要對的話,
最好不要用這個方法
如果只想列出數字,
不做任何運算
aggfunc中dict的鍵值組:
‘Peak Value(DB)’:list
輸出結果:
或使用以下語法:
df.groupby(‘Range Index’)[‘Peak Value(DB)’].apply(list)
pivot_table()
和 groupby()
都是用來進行数据透视操作,但是它们的实现方式略有不同。
pivot_table()
接收三个主要参数:
index
: 用于对数据进行分组的列名或列名列表。values
: 用于对数据进行计算的列名或列名列表。aggfunc
: 对于每个分组进行的计算,可以指定一个聚合函数,如sum
、mean
、median
、max
等。
pivot_table()
会根据 index
指定的列对数据进行分组,并按照 values
指定的列进行计算,最后将计算结果按照 index
组合成一个新的数据表。
而 groupby()
更加灵活,可以在 groupby()[column name]
后面进行各种操作,例如 sum()
、mean()
、count()
、min()
、max()
、apply()
等等。此外,groupby()
还可以使用 agg()
方法对不同列应用不同的聚合函数,以及使用 transform()
方法将聚合结果转换成原始数据的形式。
因此,pivot_table()
更适合用于创建透视表,而 groupby()
更适合用于分组统计和数据分析。
pivot_table()中
參數aggfunc 吃一個dict (key不能重複)
如果想要兩欄
一欄為: ‘Peak Value(DB)’ 單純列出數值
另一欄為 ‘Peak Value(DB)’ 分組計算mean()
記得dict的key不能重複嗎?
要指定一個字典給參數aggfunc 時
會遇到問題
(字典的value使用list of functions應該可以解決)
aggfunc: function, list of functions, dict, default numpy.mean
If list of functions passed, the resulting pivot table will have hierarchical columns whose top level are the function names (inferred from the function objects themselves) If dict is passed, the key is column to aggregate and value is function or list of functions. If margin=True, aggfunc will be used to calculate the partial aggregates.
改用以下方法:
groupbyIdxObj[‘Peak Value(DB)’].apply(list):
groupbyIdxObj[‘Peak Value(DB)’].apply(lambda x: np.mean(x)):
再將以上兩個Series做 pd.concat( [ser1,ser2], axis=1):
pd.concat([ser1,ser2], axis=1).to_excel(r”C:\Temp\peakValue.xlsx”)
輸出的xlsx:
一樣用pd.pivot_table()的話
result = pd.pivot_table(df, index=’Range Index’,
values=[‘Peak Value(DB)’,
‘phi(度)’],
aggfunc={‘Peak Value(DB)’:[“mean”,list],
‘phi(度)’ :’mean’} )
但又出現順序不對的問題
(依據字母順序,而非自己list指定的順序)
結尾有修改方式,
若順序也要對的話,
最好不要用這個方法
輸出結果:
推薦hahow線上學習python: https://igrape.net/30afN
pivot_table()如何將欄位順序依據自己的意思排列?
import os
import pandas as pd
folder = r"C:\Python\AWR1443BOOST\dat"
fname = "concat_df from xwr14xx_processed_stream_2023_03_03T07_52_14_957 2.dat_.xlsx"
fpath = os.path.join(folder, fname)
df = pd.read_excel(fpath, index_col=[0, 1])
result = pd.pivot_table(df,
index='Range Index',
values=['Peak Value(DB)', 'phi(度)'],
aggfunc={'Peak Value(DB)':["mean",list],'phi(度)':'mean'})
# 修改列和欄的多級索引
result.columns = result.columns.map(lambda x:
(x[0], 'mean') if x[1] == 'mean'
else (x[0], 'list') if x[1] == list
else (x[0], x[1]) ) #x命名為tup(tuple)會更清楚
“”” 先知道columns長什麼樣子,才知道lambda函式在做什麼:
在 lambda 函數中使用 elif 會導致語法錯誤。
lambda 函數只能使用單行表達式,而不是多條語句,
因此必須使用 else 來連接不同的條件分支。
如果您想要使用多條語句,
可以考慮使用普通函數而不是 lambda 函數。
普通語法通常可以用 else 取代 elif 的寫法。
但如果有多個條件需要判斷,elif 可以比 else 更加清晰易讀。
df.columns.map(),它是 Pandas 中的一个方法,用于对 DataFrame 的列标签(columns)进行映射转换。
这个方法接收一个函数作为参数,这个函数将被应用到 DataFrame 的每一个列标签上,并返回一个映射后的新列标签”””
# 重新排序列
result = result[[('Peak Value(DB)', 'mean'),
('Peak Value(DB)', 'list'),
('phi(度)', 'mean')]]
print(result)
“”” result[[(‘Peak Value(DB)’, ‘mean’),
(‘Peak Value(DB)’, ‘list’),
(‘phi(度)’, ‘mean’)]] 外層的中括號 []
表示的是 DataFrame 的索引符號。
在 Pandas 中,將中括號 []
應用於 DataFrame 時,
可以使用以下方式進行索引:
用一個單獨的標籤(label)選擇一個 column。
用一個切片(slice)選擇一個 row 或多個 rows。
用布林索引(boolean indexing)從 DataFrame 中選擇一個子集。
由於 result 中的 columns 是多級索引,
因此在選擇 (‘Peak Value(DB)’, ‘mean’)、
(‘Peak Value(DB)’, ‘list’)
和 (‘phi(度)’, ‘mean’)
這三個 columns 時,
需要使用 [[ ]] 進行欄的索引。
如果直接使用 [] 進行欄的索引,
只能選擇單一的一個 column。”””
輸出結果:
result = result[[('Peak Value(DB)', 'mean'),
('Peak Value(DB)', 'list'),
('phi(度)', 'mean')]]
這一段程式碼已經重新排序了
#修改列和欄的多級索引
result.columns = result.columns.map()
其實沒必要:
或者使用 reindex
方法,
可以指定要重新排列的行或列索引。
如果指定的索引不存在,
則會添加缺少的行或列並填充缺失值。
或者在pivot_table()中
參數sort = False (對col不一定有效)
table.sortlevel(["A","B"], ascending= [False,True], sort_remaining=False, inplace=True)
table.sortlevel(["C"], axis=1, ascending=False, sort_remaining=False, inplace=True)
print(table)
“””# ascending: 上升
sort_remaining=False 参数用于禁用对除指定层级以外的其他层级进行排序。在进行数据透视表操作时,可能存在对指定层级排序但不对其他层级排序的需求,此时可以使用该参数。”””
推薦hahow線上學習python: https://igrape.net/30afN