【Python】Pandas dataframe資料的增刪修改與過濾、合併
參考資料
Dataframe的操作
Dataframe的初始化
#初始一個空的dataframe
df = pd.DataFrame()
#初始一個指定欄位名稱的空dataframe
df = pd.DataFrame(columns=['symbol','xxx', 'price'])
#其他範例
datesframe = pd.date_range('20200101', periods=6) pd.DataFrame(np.arrange(24).reshape((4,6)), index=datesframe, columns=['A', 'B', 'C', 'D'])
Dataframe的狀態與資訊
#顯示資料相關資訊
df.info()
#顯示記憶體使用狀況
df.info(memory_usage='deep')
欄位的增刪查改
#顯示有哪些欄位
df.columns
#新增欄位
df.insert(index, '欄位名稱', )
#修改欄位名稱
df.rename(columns = {'舊欄位名稱1': '新欄位名稱1', '舊欄位名稱2': '新欄位名稱2'}, inplace = True)
df.columns = ['新欄位名稱1','新欄位名稱2','新欄位名稱3']
#刪除某欄
df = df.drop('Column_A', axis=1) #axis=0,代表列; axis=1,代表行
df = df.drop(['Column_A', 'Column_B', 'Column_C'], axis=1)
數據的增刪查改
#新增一列數據
a = { 'a':1, 'b':1, 'c':1 }
df = df.append(a, ignore_index=True)
#替換數據
df.replace(to_replace=None, value=None)
#修改某欄中的特定字串
df['Column_A'].replace('XXX', 'YYY', inplace=True) #inplace=True代表直接替換掉原數據
df['Column_A'].str.replace('XXX','YYY')
#修改多個值。所有df中的XXX改為0.1,YYY改為0.2
df.replace({'XXX':0.1},{'YYY':0.2})
#修改多個值。所有df中的XXX或YYY改為0.1
df.replace(['XXX','YYY'], 0.1)
#透過正規表示法來修改數值。將df中所有數值為A~Z的內容改為0.1
df.replace('[A-Z]',0.1, regex=True)
數據的處理
df.groupby('XXX').count() #每個類別的數量
df.groupby('XXX').mean() #每個類別的平均
df.groupby('XXX').std() #每個類別的標準差
df.groupby('XXX').median() #每個類別的中位數
空值的處理
刪除欄位值顯示為NaNk的資料
#只要欄位有空值的資料列都刪除
df.dropna()
df.dropna(how='any')
#各欄位值皆為空值才刪除
df.dropna(how='all')
#特定欄位中包含空值的資料列才刪除
df.dropna(subset=['Column_A',])
#將空值以其他數值取代
df.fillna(0)
#針對某欄,將空值以其他數值取代
df['Column_C'] = df['Column_C'].fillna(df['Column_C'].mean())
#將dataframe中所有的空白字元拿掉
df.replace('\s+','', regex=True, inplace=True)
#轉置矩陣
df.T
#欄位的重新排序
#原本欄位順序a,b,c,d,改為b,a,d,c
df.reindex(
#依照某欄內的數值大小排序
#ascending:True為遞增,False為遞減
df.sort_values('Column_A', ascending=False)
#排序後,重新更新index
df.reset_index(drop=True)
#排序後,重新更新index,且index從1開始
df.reset_index(drop=True).set_axis(range(1, len(df)+1))
#擷取部份欄位
#假設原本有A,B,C,D,E欄位,但新的dataframe只需要A,B,C
df = pd.Dataframe(df, columns=['A','B','C'])
#如果dataframe沒有欄位名稱
df = df.iloc[:, [2,3,4]] #取index 2,3,4的欄位
Traversal
#DataFrame
for item in dfA.iterrows():
xxx
#List
for item in listA.items():
xxx
#Array
for item in arrayA:
xxx
檔案操作
csv的讀寫
#Read CSV
pd.DataFrame.from_csv('csv_file')
pd.read_csv('csv_file')
#Write CSV
df.to_csv('data.csv', index=False)
df.to_csv('data.csv', sep=',', index=False)
Excel的讀寫
基本型態
#Read Excel
pd.read_excel('excel_file')
#Write Excel(單一sheet)
pd.to_excel('excel_file')
如果是要將資料寫入Excel的多個sheet
如果是要append上去,而不是覆蓋的話,mode可以改為「a」
#Write Excel(多個sheet)
with pd.ExcelWriter('檔案名稱', mode='w') as writer:
df1.to_excel(writer, sheet_name='A', encoding='utf_8_sig', index=False)
df2.to_excel(writer, sheet_name='B', encoding='utf_8_sig', index=False)
如果想要輸出的excel自動調整欄寬,可以改寫為以下
# Auto-adjust columns' width
for column in df:
# 找出該欄位名稱的最大值
column_width = max(df[column].astype(str).map(len).max(), len(column))
# 使用get_loc找出該欄位的index
col_idx = df.columns.get_loc(column)
# 設定欄寬
sheet.set_column(col_idx, col_idx, column_width)
如果有遇到「’Worksheet’ object has no attribute ‘set_column’」這個錯誤
安裝以下套件即可
pip install xlsxwriter
其他操作
#選擇欄
df['A'] or df.A
#根據標籤選擇 - loc
df.loc(:,['A','B'] #取得所有的列欄位'A'與欄位'B'的資料
df.loc('20200101',['A','B']] #取得列20200101的欄位'A'與欄位'B'資料
df.loc['20200101'] #取得列20200101的所有欄位資料
#根據序列選擇 - iloc (位置從0算起)
df.iloc[3,1] #取得第4列、第2行的資料
df.iloc[3:5,1:3] #取得第4~5列、第2~3欄的資料
df.iloc[[1,3,5],1:3] #取得第1,3,5列、第2~3欄的資料
#混合選擇 - ix
df.ix(:3,['A',C'] #取0~2列、'A''C'兩欄的資料
#條件式篩選
df[df.A>8] #列出所有'A'欄位>8的所有資料列
#從dict中取值
def get_key(val): for key, value in my_dict.items(): if val == value: return key return "key doesn't exist"
#過濾資料
mask = df['date']==datetime.strptime('2021-02-26', '%Y-%m-%d').date()
df[mask]
#過濾資料的日期區間-三種方式
df.query("Joined_date >= '2019-06-1' and Joined_date <='2020-02-05'")
mask = (df['col'] > start_date) & (df['col'] <= end_date)
df = df[mask]
mask=df['Joined_date'].isin(pd.date_range('2019-06-1', '2020-02-05'))
df = df[mask]
mask=df['Company].str.contrains('中華電信')
df = df[mask]
#取出一個dataframe的子集合,取出2~4列,b、d兩欄
df[2:4][['b','d']]
DataFrame合併
Concat(會保留重複index)
DataFrame欄位計算後,放置到新增的欄位
def mul_ab(row):
return row['Column_A'] * row['Column_B']
df['Column_C'] = df.apply(mul_ab, axis=1)