今日任務:
DataFrame
DataFrame的構造
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
參數說明:
data
:DataFrame 的數據部分,可以是字典、二維數組、Series、DataFrame 或其他可轉換為 DataFrame 的對象。如果不提供此參數,則創建一個空的 DataFrame。index
:DataFrame 的行索引,用于標識每行數據。可以是列表、數組、索引對象等。如果不提供此參數,則創建一個默認的整數索引。columns
:DataFrame 的列索引,用于標識每列數據。可以是列表、數組、索引對象等。如果不提供此參數,則創建一個默認的整數索引。dtype
:指定 DataFrame 的數據類型。可以是 NumPy 的數據類型,例如?np.int64
、np.float64
?等。如果不提供此參數,則根據數據自動推斷數據類型。copy
:是否復制數據。默認為 False,表示不復制數據。如果設置為 True,則復制輸入的數據。
DataFrame的創建
- 用列表
import pandas as pddata = [
['Google', 10],
['Runoob', 12],
['Wiki', 13]]# 創建DataFrame
df = pd.DataFrame(data, columns=['Site', 'Age'])# 使用astype方法設置每列的數據類型
df['Site'] = df['Site'].astype(str)
df['Age'] = df['Age'].astype(float)print(df)
- ?用數組
import numpy as np
import pandas as pd# 創建一個包含網站和年齡的二維ndarray
ndarray_data = np.array([['Google', 10],['Runoob', 12],['Wiki', 13]
])# 使用DataFrame構造函數創建數據幀
df = pd.DataFrame(ndarray_data, columns=['Site', 'Age'])# 打印數據幀
print(df)?
- 用字典,按列
import pandas as pddata = {
'Site':['Google', 'Runoob', 'Wiki'],
'Age':[10, 12, 13]
}df = pd.DataFrame(data)print (df)
- 用字典,按行,沒有對應的部分數據為?NaN。
import pandas as pddata = [{'a': 1, 'b': 2},
{'a': 5, 'b': 10, 'c': 20}]df = pd.DataFrame(data)print (df)
返回指定數據
- 按索引名
返回單行,結果其實是一個Series,該Series的索引名是DataFrame的列名,列名是DataFrame的索引名
import pandas as pddata = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}# 數據載入到 DataFrame 對象
df = pd.DataFrame(data)# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])
結果:
calories 420
duration 50
Name: 0, dtype: int64
calories 380
duration 40
Name: 1, dtype: int64
返回多行,結果其實是一個DataFrame,列名索引名不變
import pandas as pddata = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}# 數據載入到 DataFrame 對象
df = pd.DataFrame(data)# 返回第一行和第二行
print(df.loc[[0, 1]])
結果:
calories duration
0 420 50
1 380 40
如果索引名不是默認的從0開始的整數:
import pandas as pddata = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}df = pd.DataFrame(data, index = ["day1", "day2", "day3"])# 指定索引
print(df.loc["day2"])
- 按列名
import pandas as pddata = {"calories": [420, 380, 390],"duration": [50, 40, 45]"others": [123, 22, 66]
}df = pd.DataFrame(data)# 指定索引
print(df[['calories','duration']])
- 訪問單個元素
先列,后行
print(df['Name'][0])
先行,后列,表示所有的行,列名為'Column1'
print(df.loc[:, 'Column1'])
.loc[]和.iloc[]的區別
.loc[]是按索引名
.iloc[]是按位置
import pandas as pddata = [
['amy','tony']
]df=pd.DataFrame(data, index=['girl','boy'], columns='name')#第一行
print(df.loc['girl'])#第一行
print(df.iloc[0])
# 索引和切片
print(df[['Name', 'Age']]) # 提取多列
print(df[1:3]) # 切片行
print(df.loc[:, 'Name']) # 提取單列
print(df.loc[1:2, ['Name', 'Age']]) # 標簽索引提取指定行列
print(df.iloc[:, 1:]) # 位置索引提取指定列
DataFrame常用方法,與Seires類似
head(n) | 返回 DataFrame 的前 n 行數據(默認前 5 行) |
tail(n) | 返回 DataFrame 的后 n 行數據(默認后 5 行) |
info() | 顯示 DataFrame 的簡要信息,包括列名、數據類型、非空值數量等 |
describe() | 返回 DataFrame 數值列的統計信息,如均值、標準差、最小值等 |
shape | 返回 DataFrame 的行數和列數(行數, 列數) |
columns | 返回 DataFrame 的所有列名 |
index | 返回 DataFrame 的行索引 |
dtypes | 返回每一列的數值數據類型 |
sort_values(by,ascending) | 按照指定列排序,by=列名,ascending=True(升序) or False(降序) |
sort_index() | 按行索引排序 |
dropna() | 刪除含有缺失值(NaN)的行或列 |
fillna(value) | 用指定的值填充缺失值 |
isnull() | 判斷缺失值,返回一個布爾值 DataFrame |
notnull() | 判斷非缺失值,返回一個布爾值 DataFrame |
loc[] | 按標簽索引選擇數據 |
iloc[] | 按位置索引選擇數據 |
at[] | 訪問 DataFrame 中單個元素(比?loc[] ?更高效) |
iat[] | 訪問 DataFrame 中單個元素(比?iloc[] ?更高效) |
apply(func) | 對 DataFrame 或 Series 應用一個函數 |
applymap(func) | 對 DataFrame 的每個元素應用函數(僅對 DataFrame) |
groupby(by) | 分組操作,用于按某一列分組進行匯總統計 |
pivot_table() | 創建透視表 |
merge() | 合并多個 DataFrame(類似 SQL 的 JOIN 操作) |
concat() | 按行或按列連接多個 DataFrame |
to_csv() | 將 DataFrame 導出為 CSV 文件 |
to_excel() | 將 DataFrame 導出為 Excel 文件 |
to_json() | 將 DataFrame 導出為 JSON 格式 |
to_sql() | 將 DataFrame 導出為 SQL 數據庫 |
query() | 使用 SQL 風格的語法查詢 DataFrame |
duplicated() | 返回布爾值 DataFrame,指示每行是否是重復的 |
drop_duplicates() | 刪除重復的行 |
set_index() | 設置 DataFrame 的索引 |
reset_index() | 重置 DataFrame 的索引 |
transpose() | 轉置 DataFrame(行列交換) |
數據修改
修改列數據:重新賦值
df['Column1'] = [10, 11, 12]
添加新列:給新列賦值
df['NewColumn'] = [100, 200, 300]
合并行/列
pd.concat():pandas 內部的一個方便的函數,用于垂直(按行)或水平(按列)連接 DataFrame。
objs 參數是一個要串聯的 Series 或 DataFrame 對象的序列或映射。
axis 參數決定連接的方向:
axis=0 設置為缺省值(默認),這意味著它將垂直(按行)連接 DataFrame。
axis=1 將水平連接 DataFrame(按列)。
# 使用concat添加新行
new_row = pd.DataFrame([[4, 7]], columns=['A', 'B']) # 創建一個只包含新行的DataFrame
df = pd.concat([df, new_row], ignore_index=True) # 將新行添加到原始DataFrameprint(df)
merge()
pd.merge(df1, df2, on='Column1')
分割
pivot、melt
刪除
刪除列
df_dropped = df.drop('Column1', axis=1)
刪除行
df_dropped = df.drop(0) # 刪除索引為 0 的行
刪除重復行
drop_duplicates(subset =, keep = 'first', inplace = False)
drop_duplicates() 函數參數定義:
subset:此參數標識重復行時要考慮的列標簽或標簽序列。如果未提供,它將處理 DataFrame 中的所有列。
keep:此參數確定要保留的重復行。
'first': (默認) 刪除除第一個匹配項以外的重復項。
'last': 刪除除最后一個匹配項之外的重復項。
False: 刪除所有重復項。
inplace: 如果設置為 True,則直接對對象進行更改,而不返回新的對象。如果設置為 False(默認),則返回丟棄重復的新對象。
刪除缺失值
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
dropna 函數參數定義:
axis: 它可以是 {0 or 'index', 1 or 'columns'}。默認為 0。如果 axis=0,則丟棄包含缺失值的行;如果 axis=1,則丟棄包含缺失值的列。
how: 確定當我們至少有一個 NA 或全部 NA 時,是否從 DataFrame 中刪除行或列。
how='any': 如果存在任何 NA 值,則刪除該行或列(默認)。
how='all': 如果所有值都為 NA,則刪除該行或列。
thresh: 需要多少非 NA 值。這是一個整型參數,需要最小數量的非 NA 值才能保留行/列。
subset: 要考慮的另一個軸上的標簽,例如,如果您正在刪除行,則這些標簽將是要包括的列的列表。當您只想考慮某些列中的 NA 值時,這特別有用。
inplace: 這是一個布爾值,如果是 True,則對 DataFrame 本身進行更改。請記住,在使用 inplace=True 參數時,您修改的是原始的 DataFrame。如果出于任何原因需要保留原始數據,請避免使用 inplace=True,而是將結果賦給新的 DataFrame。
列/索引重命名
DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None, errors='raise')
mapper, index, columns:可以傳遞以重命名索引或列的詞典。在我們的示例中,我們使用 columns。
axis: 可以是 "index" 或 "columns"。確定是重命名索引還是重命名列。默認情況下,如果您提供 columns 參數,您將重命名列。
copy: 如果設置為 True,則創建一個新的 DataFrame。如果為 False,則修改原始 DataFrame。
inplace: 如果設置為 True,則重命名會原地修改 DataFrame,不會返回任何內容。如果為 False,則在不修改原有 DataFrame 的情況下,返回一個新的帶有更名列的 DataFrame。
level: 對于具有多級索引的 DataFrame,應當重命名標簽的級別。
errors: 如果是 'raise',如果嘗試重命名不存在的項,則會引發錯誤。如果設置為 'ignore',任何重命名項目的失敗都將被忽略。
我們關注'columns','index'參數就可以了
import pandas as pdnewname={'id':'student_id','first':'first_name','last':'last_name','age':'age_in_years'}
students.rename(columns=newname,inplace=True)
改變數據類型
DataFrame.astype(dtype, copy=True, errors='raise')
dtype: 它是一種數據類型,或列名->數據類型的字典。
copy: 默認情況下,astype 總是返回新分配的對象。如果 copy 設置為 False,則只有在舊對象無法強制轉換為所需類型的情況下才會創建新對象。
errors: 控制對提供的數據類型的無效數據引發異常。默認設置為 raise,表示會引發異常。
students = students.astype( {'grade':int})
return students
填充缺失值
.fillna(value, method = None, axis, inplace)
value: 標量,字典,Series 或 DataFrame。用于填充空洞的值(例如 0)。這就是我們在解決方案中使用的。
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}。用于填充重新索引 Series 中的空洞的方法。默認為 None。
axis: {0 or ‘index’, 1 or ‘columns’}。沿其填充缺失值的軸。
inplace: 布爾值。如果為True,則原地填充。注意:這將修改此對象上的任何其他視圖。默認值為 False。
由于這個函數無法制定列/行,所以如果想要對某一行/列填充缺失值,就要把fillna這個函數作用在這個列/行上
products['quantity'].fillna(0,inplace=True)
長、寬表格轉換(透視)
pivot 函數
在 pandas 中 pivot 函數被用來基于列的值重塑數據并且在外部得到一個新的 DataFrame。pivot 采用我們將使用的以下參數:
index: 確定新 DataFrame 中的行。
columns: 確定新 DataFrame 中的列。
values: 指定重塑表格時要使用的值。
舉例:
將上面的表轉換為下面的表:
weather.pivot(index='month',columns='city',values='temperature')
melt 函數
?pandas 的 melt 函數用于轉換或重塑數據。它將 DataFrame 從寬格式(列表示多個變量)更改為長格式(每行表示一個唯一變量)。
舉例解釋:
id_vars:這指定了應該保持不變的列。對于這個問題,只有 product 列保持不變,因為我們希望輸出中的每一行都與一個產品相關聯。
value_vars:這指定了我們想要“melt”或將其整形成行的列。在我們的示例中,以下是每個季度的銷售數據列:quarter_1、quarter_2、quarter_3 和 quarter_4。
var_name:這是將存儲來自 value_vars 的標頭名稱的新列的名稱。在我們的問題中,這些是季度名稱。
value_name:這是將存儲 value_vars 中的值的新列的名稱。在我們的問題中,這將是每個季度每種產品的銷售數據。
pandas的方法真的太多了,靠人腦子真的記不過來。不過雖然平時在處理數據的時候,我一般都是讓AI編寫程序,因為這種清洗、處理數據的活,AI可以做的非常好,思路明確,不用人絞盡腦汁思考先處理什么,再處理什么,效率嘎嘎高。不太確定學習到的這些方法,過兩天還能不能記得住,但總歸有些印象,真工作的時候,還讓AI干。今晚在力扣上刷了一些pandas的題目,還是感覺到自己的思路被拓寬了(os:原來數據還能這么分析),這也是學習pandas的一些收獲吧。一邊學基本的方法,一邊刷力扣,我覺得是非常有用的,可以看到學習的這些方法,都可以怎么去處理實際問題,所以邊學邊干,進步飛快~
今晚周五同事們下班的都賊早,七點半的時候辦公室就只有我一個人了(以往九點鐘人都很多),+2不知道從哪里突然冒出來,嚇了我一跳,催另一個同事下班,居然沒催我下班,應該是看到我在學習pandas了。希望我不要被冠以卷王的名號(雖然我感覺在辦公室已經有這個苗頭了),沒辦法,我是苦逼實習生,白天實習,晚上秋招,時不時導師那邊還要開組會,你們這些正式工就別和我卷了,真說卷,我也卷不過你們,你們晚上十點才下班的。。。。