Pandas數(shù)據(jù)結(jié)構(gòu)DataFrame使用方式
DataFrame是Pandas庫中最核心的數(shù)據(jù)結(jié)構(gòu),它以一種表格形式組織數(shù)據(jù),類似于 Excel 電子表格或 SQL 數(shù)據(jù)庫表。這種二維數(shù)據(jù)結(jié)構(gòu)特別適合處理結(jié)構(gòu)化數(shù)據(jù)。
本文介紹了Pandas中DataFrame的核心功能,包括創(chuàng)建、基本操作(查看、選擇、過濾、修改)、常用功能(統(tǒng)計(jì)、缺失值處理、排序、分組聚合、應(yīng)用自定義函數(shù)、數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換)、合并與分割方法等。
一、DataFrame主要構(gòu)成
- 行(Rows):每行代表一個(gè)獨(dú)立的觀測值或數(shù)據(jù)記錄,例如一個(gè)人的完整信息
- 列(Columns):每列代表一個(gè)特定的變量或特征,如"年齡"、"城市"等
- 索引(Index):類似于行的身份證號,用于快速定位和識別特定行
二、創(chuàng)建DataFrame
1. 從字典創(chuàng)建
從字典創(chuàng)建最直觀,字典的鍵自動成為列名,值成為對應(yīng)列的數(shù)據(jù)。適合數(shù)據(jù)已經(jīng)按列組織好的情況。
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']
}
df = pd.DataFrame(data)
2. 從列表創(chuàng)建
當(dāng)數(shù)據(jù)是按行組織的記錄時(shí),這種方法更合適。需要顯式指定列名,否則會自動生成數(shù)字列名(0,1,2…)。
data = [
['Alice', 25, 'New York'], # 第一個(gè)人的完整信息
['Bob', 30, 'Paris'], # 第二個(gè)人的完整信息
['Charlie', 35, 'London'] # 第三個(gè)人的完整信息
]
# 將列表轉(zhuǎn)換為DataFrame,并指定列名
df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])
三、DataFrame基本操作
1. 查看數(shù)據(jù)
以下方法可以在不顯示全部數(shù)據(jù)的情況下,快速了解DataFrame的概況。
df.head() # 查看前5行 df.tail(3) # 查看后3行 df.shape # 查看維度(行數(shù),列數(shù)) df.columns # 查看列名 df.dtypes # 查看每列數(shù)據(jù)類型
2. 選擇數(shù)據(jù)
df['Name'] # 選擇單列,返回Series對象 df[['Name', 'Age']] # 選擇多列,返回新的DataFrame df.loc[0] # 按標(biāo)簽選擇第一行所有數(shù)據(jù) df.iloc[0] # 按位置(索引)選擇第一行所有數(shù)據(jù)
- loc 基于標(biāo)簽選擇,適合已知行/列名的情況
- iloc 基于位置選擇,適合按數(shù)字索引訪問
3. 過濾數(shù)據(jù)
布爾索引是DataFrame的篩選功能,可以使用復(fù)雜條件組合來精確選擇所需數(shù)據(jù)。
df[df['Age'] > 30] # 年齡大于30的記錄 df[(df['Age'] > 25) & (df['City'] == 'Paris')] # 多條件篩選:年齡>25且城市為Paris
4. 修改數(shù)據(jù)
DataFrame的列操作可以像操作普通變量一樣修改列數(shù)據(jù)。
df['Age'] = df['Age'] + 1 # 年齡列全部加1 df['New_Column'] = range(3) # 添加新列
四、DataFrame常用功能
1. 描述性統(tǒng)計(jì)
使用統(tǒng)計(jì)方法能快速了解數(shù)據(jù)的分布情況和基本特征。
df.info() # 快速查看DataFrame的摘要信息,包括列名、非空值數(shù)量、數(shù)據(jù)類型等 df.describe() # 對數(shù)值列計(jì)算統(tǒng)計(jì)量(計(jì)數(shù)、均值、標(biāo)準(zhǔn)差等) df.mean(numeric_only=True) # 計(jì)算各數(shù)值列的均值 df['Age'].value_counts() # 統(tǒng)計(jì)年齡列中每個(gè)值的出現(xiàn)次數(shù)
df.describe()
默認(rèn)情況下只對數(shù)值列計(jì)算統(tǒng)計(jì)量,需要會對于非數(shù)值列計(jì)算,可以使用 include='all' 參數(shù)。
- 對于數(shù)值列:計(jì)算計(jì)數(shù)(count)、均值(mean)、標(biāo)準(zhǔn)差(std)、最小值(min)、四分位數(shù)(25%、50%、75%)和最大值(max)
- 對于非數(shù)值列:計(jì)算計(jì)數(shù)(count)、唯一值數(shù)量(unique)、出現(xiàn)頻率最高的值(top)及其出現(xiàn)頻率(freq)
參數(shù)
df.describe(
percentiles=None, # 指定要計(jì)算的分位數(shù)
include=None, # 指定包含的數(shù)據(jù)類型
exclude=None, # 指定排除的數(shù)據(jù)類型
datetime_is_numeric=False # 是否將datetime視為數(shù)值型
)
基本示例
import pandas as pd
import numpy as np
# 創(chuàng)建示例DataFrame
df = pd.DataFrame({
'數(shù)值列': np.random.randn(100),
'分類列': np.random.choice(['A', 'B', 'C'], 100),
'缺失列': np.random.choice([1, 2, np.nan], 100)
})
# 默認(rèn)describe
print(df.describe())
控制輸出內(nèi)容
# 只計(jì)算特定分位數(shù) df.describe(percentiles=[0.1, 0.5, 0.9]) # 只包含數(shù)值列 df.describe(include=[np.number]) # 包含所有列 df.describe(include='all') # 排除數(shù)值列 df.describe(exclude=[np.number])
df.mean()
df.mean()可以對 DataFrame 或 Series 中的數(shù)值數(shù)據(jù)計(jì)算算術(shù)平均值。
參數(shù)
df.mean(
axis=0, # 計(jì)算方向:0-列方向,1-行方向
skipna=True, # 是否跳過NaN值
numeric_only=True, # 是否只計(jì)算數(shù)值列
**kwargs # 其他參數(shù)
)
對DataFrame使用
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [1.5, 2.5, 3.5, 4.5],
'C': ['a', 'b', 'c', 'd'] # 非數(shù)值列
})
# 計(jì)算各列的平均值
print(df.mean())
對Series使用
s = pd.Series([10, 20, 30, 40]) print(s.mean()) # 輸出: 25.0
常見場景
# 計(jì)算每列的平均值 column_means = df.mean() # 默認(rèn)axis=0 # 計(jì)算每行的平均值 row_means = df.mean(axis=1) # 只計(jì)算數(shù)值列(推薦方式) df.mean(numeric_only=True)
df_with_nan = pd.DataFrame({'A': [1, 2, np.nan, 4]})
# 跳過NaN計(jì)算
df_with_nan.mean() # 輸出A列平均值:(1+2+4)/3 ≈ 2.333
# 包含NaN計(jì)算
df_with_nan.mean(skipna=False) # 輸出NaN
2. 處理缺失值
處理缺失值是數(shù)據(jù)清洗的重要步驟,根據(jù)情況選擇刪除或填充。
df.dropna() # 刪除含缺失值的整行 df.fillna(0) # 用0填充缺失值 df.isna().sum() # 統(tǒng)計(jì)每列的缺失值數(shù)量
3. 排序
排序可以快速發(fā)現(xiàn)數(shù)據(jù)的極值等等。
df.sort_values('Age', ascending=False) # 按年齡降序排列
4. 分組聚合
分組聚合可以計(jì)算各組的統(tǒng)計(jì)量。
print(df.groupby('City')['Age'].mean()) # 按城市分組計(jì)算平均年齡
5. 應(yīng)用自定義函數(shù)
對DataFrame的行或列應(yīng)用自定義函數(shù)。
df['Age'].apply(lambda x: x * 2) # 對Age列的值進(jìn)行加倍
6. 數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換
DataFrame轉(zhuǎn)列表
# 返回所有數(shù)據(jù)(不含列名)的二維列表。 data = df.values.tolist() # 提取某一列的數(shù)據(jù),轉(zhuǎn)換為列表。 names = df['Name'].tolist()
DataFrame轉(zhuǎn)字典
# 默認(rèn)返回 {列名: {索引: 值}} 的嵌套字典結(jié)構(gòu)。
dict_data = df.to_dict()
# 返回 [{列名: 值}, ...] 格式的字典列表,適合 JSON 轉(zhuǎn)換。
dict_records = df.to_dict('records')
DataFrame轉(zhuǎn)NumPy數(shù)組
# 返回 DataFrame 的 NumPy 數(shù)組形式(不包含列名)。 numpy_array = df.to_numpy()
DataFrame轉(zhuǎn)JSON
# 將 DataFrame 轉(zhuǎn)換為 JSON 字符串。 json_str = df.to_json() # 指定格式(orient 參數(shù)) json_records = df.to_json(orient='records')
五、DataFrame合并
1. concat連接合并
concat是最簡單的合并方法,適合結(jié)構(gòu)相同的數(shù)據(jù)集簡單拼接。
import pandas as pd
# 創(chuàng)建示例DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=[0, 1, 2])
df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
'B': ['B3', 'B4', 'B5']},
index=[3, 4, 5])
# 縱向連接(默認(rèn)axis=0)
result = pd.concat([df1, df2])
# 橫向連接
result_h = pd.concat([df1, df2], axis=1)
2. merge鍵值合并
merge是基于列的合并,類似于SQL的JOIN操作,根據(jù)鍵值合并相關(guān)數(shù)據(jù)。
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
# 內(nèi)連接(默認(rèn))
result = pd.merge(left, right, on='key')
# 左連接
result_left = pd.merge(left, right, how='left', on='key')
# 右連接
result_right = pd.merge(left, right, how='right', on='key')
# 外連接
result_outer = pd.merge(left, right, how='outer', on='key')
3. join索引合并
join是基于索引的合并方法,適合索引有意義的場景。
left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2'],
'D': ['D0', 'D1', 'D2']},
index=['K0', 'K1', 'K3'])
# 左連接(默認(rèn))
result = left.join(right)
# 右連接
result_right = left.join(right, how='right')
# 內(nèi)連接
result_inner = left.join(right, how='inner')
# 外連接
result_outer = left.join(right, how='outer')
4. 多鍵合并
當(dāng)需要多個(gè)字段共同確定關(guān)聯(lián)關(guān)系時(shí),可以使用多鍵合并。
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
result = pd.merge(left, right, on=['key1', 'key2'])
5. 合并時(shí)處理重復(fù)列名
當(dāng)兩個(gè)DataFrame有相同列名但不是連接鍵時(shí),添加后綴避免沖突。
# 合并時(shí)對重復(fù)列名添加后綴區(qū)分
result = pd.merge(left, right, on='key1', suffixes=('_left', '_right'))
6. 合并時(shí)添加指示列
indicator列會顯示每行是來自"left_only"、“right_only"還是"both”,便于追蹤合并結(jié)果。
# 合并后添加一列指示每行數(shù)據(jù)的來源 result = pd.merge(left, right, on='key1', how='outer', indicator=True)
六、DataFrame分割
1. 按行分割
行分割常用于將大數(shù)據(jù)集分成多個(gè)部分處理,或提取符合條件的子集。
# 創(chuàng)建示例DataFrame
df = pd.DataFrame({'A': range(10),
'B': range(10, 20),
'C': range(20, 30)})
# 取前3行
df_head = df.head(3)
# 取后3行
df_tail = df.tail(3)
# 按位置分割
df_part1 = df.iloc[:5] # 前5行
df_part2 = df.iloc[5:] # 第6行到最后
# 按條件分割
df_filtered = df[df['A'] > 5] # A列大于5的行
2. 按列分割
列分割常用于特征選擇,提取感興趣的變量或特定類型的數(shù)據(jù)。
# 選擇單列(返回Series) col_a = df['A'] # 選擇多列(返回DataFrame) cols_ab = df[['A', 'B']] # 按數(shù)據(jù)類型選擇:只選擇數(shù)值型列 numeric_cols = df.select_dtypes(include=['number'])
3. 隨機(jī)分割
隨機(jī)分割常用于創(chuàng)建訓(xùn)練集和測試集,或進(jìn)行隨機(jī)抽樣分析。
# 隨機(jī)抽取30%的數(shù)據(jù) df_sample = df.sample(frac=0.3) # 隨機(jī)抽取固定數(shù)量(5行) df_sample_fixed = df.sample(n=5)
4. 分組后分割
分組后分割可以讓我們分別處理每個(gè)組的數(shù)據(jù)。
# 創(chuàng)建分組對象
grouped = df.groupby('A')
# 獲取特定組
group_5 = grouped.get_group(5)
# 遍歷所有組
for name, group in grouped:
print(f"Group {name}:")
print(group)
七、DataFrame與原生數(shù)據(jù)結(jié)構(gòu)比較
DataFrame適合場景
- 結(jié)構(gòu)化數(shù)據(jù)處理(表格、CSV、SQL 表等):天然適合處理行-列結(jié)構(gòu)的數(shù)據(jù),更直觀
- 數(shù)據(jù)清洗與轉(zhuǎn)換:內(nèi)置方法豐富,處理缺失值、數(shù)據(jù)歸一化、分類聚合等
- 數(shù)據(jù)分析與統(tǒng)計(jì)計(jì)算:內(nèi)置 mean()、sum()、describe() 等方法,便捷。
- 大數(shù)據(jù)處理:底層基于 NumPy/C,運(yùn)算速度比純 Python list 快(特別是百萬級數(shù)據(jù))。
- 數(shù)據(jù)可視化支持:可直接對接 Matplotlib、Seaborn 等庫。
- 數(shù)據(jù)庫/文件交互:支持直接讀取/寫入 CSV、Excel、SQL、JSON、Parquet 等格式,比手動解析更簡單。
原生數(shù)據(jù)結(jié)構(gòu)適合場景
- 非結(jié)構(gòu)化數(shù)據(jù)(如嵌套 JSON、樹形數(shù)據(jù)):如果數(shù)據(jù)不是表格形式,dict 或 list 更靈活。
- 小規(guī)模數(shù)據(jù):如果數(shù)據(jù)量極小,DataFrame 可能顯得“殺雞用牛刀”。
- 需要低內(nèi)存開銷:list 和 dict 的內(nèi)存占用通常比 DataFrame 更?。ǖ珷奚擞?jì)算速度)。
- 需要定制化操作:Python 原生結(jié)構(gòu)可能更易控制。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python利用裝飾器進(jìn)行運(yùn)算的實(shí)例分析
本文主要是通過使用Python的裝飾器來做一個(gè)運(yùn)算的實(shí)例,來給大家詳細(xì)介紹下Python的裝飾器,非常的實(shí)用,有需要的小伙伴可以參考下。2015-08-08
Python使用pickle模塊實(shí)現(xiàn)序列化功能示例
這篇文章主要介紹了Python使用pickle模塊實(shí)現(xiàn)序列化功能,結(jié)合實(shí)例形式分析了基于pickle模塊的序列化操作相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
NCCL深度學(xué)習(xí)之初始化及ncclUniqueId的產(chǎn)生源碼解析
這篇文章主要為大家介紹了NCCL源碼解析之初始化及ncclUniqueId的產(chǎn)生詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Python機(jī)器學(xué)習(xí)性能度量利用鳶尾花數(shù)據(jù)繪制P-R曲線
這篇文章主要為大家介紹了Python機(jī)器學(xué)習(xí)性能度量利用鳶尾花數(shù)據(jù)繪制P-R曲線示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02

