最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas數(shù)據(jù)結(jié)構(gòu)DataFrame使用方式

 更新時間:2025年10月09日 08:51:45   作者:AI手記叨叨禮拜天  
本文系統(tǒng)介紹了Pandas DataFrame的核心功能,涵蓋創(chuàng)建方式、基本操作(查看、選擇、過濾、修改)、統(tǒng)計分析、缺失值處理、合并分割等,并對比了其與原生數(shù)據(jù)結(jié)構(gòu)的優(yōu)劣勢,強調(diào)其在結(jié)構(gòu)化數(shù)據(jù)處理、高效計算和多格式交互中的優(yōu)勢

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)計、缺失值處理、排序、分組聚合、應(yīng)用自定義函數(shù)、數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換)、合并與分割方法等。

一、DataFrame主要構(gòu)成

  • 行(Rows):每行代表一個獨立的觀測值或數(shù)據(jù)記錄,例如一個人的完整信息
  • 列(Columns):每列代表一個特定的變量或特征,如"年齡"、"城市"等
  • 索引(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ù)字列名(0,1,2…)。

data = [
    ['Alice', 25, 'New York'],  # 第一個人的完整信息
    ['Bob', 30, 'Paris'], 		# 第二個人的完整信息
    ['Charlie', 35, 'London']	# 第三個人的完整信息
]

# 將列表轉(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)計

使用統(tǒng)計方法能快速了解數(shù)據(jù)的分布情況和基本特征。

df.info() # 快速查看DataFrame的摘要信息,包括列名、非空值數(shù)量、數(shù)據(jù)類型等
df.describe()       # 對數(shù)值列計算統(tǒng)計量(計數(shù)、均值、標(biāo)準(zhǔn)差等)
df.mean(numeric_only=True)    # 計算各數(shù)值列的均值
df['Age'].value_counts()  # 統(tǒng)計年齡列中每個值的出現(xiàn)次數(shù)

df.describe()

默認情況下只對數(shù)值列計算統(tǒng)計量,需要會對于非數(shù)值列計算,可以使用 include='all' 參數(shù)。

  • 對于數(shù)值列:計算計數(shù)(count)、均值(mean)、標(biāo)準(zhǔn)差(std)、最小值(min)、四分位數(shù)(25%、50%、75%)和最大值(max)
  • 對于非數(shù)值列:計算計數(shù)(count)、唯一值數(shù)量(unique)、出現(xiàn)頻率最高的值(top)及其出現(xiàn)頻率(freq)

參數(shù)

df.describe(
    percentiles=None,  # 指定要計算的分位數(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)
})

# 默認describe
print(df.describe())

控制輸出內(nèi)容

# 只計算特定分位數(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ù)計算算術(shù)平均值。

參數(shù)

df.mean(
    axis=0,            # 計算方向:0-列方向,1-行方向
    skipna=True,       # 是否跳過NaN值
    numeric_only=True, # 是否只計算數(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ù)值列
})

# 計算各列的平均值
print(df.mean())

對Series使用

s = pd.Series([10, 20, 30, 40])
print(s.mean())  # 輸出: 25.0

常見場景

# 計算每列的平均值
column_means = df.mean()  # 默認axis=0

# 計算每行的平均值
row_means = df.mean(axis=1)

# 只計算數(shù)值列(推薦方式)
df.mean(numeric_only=True)
df_with_nan = pd.DataFrame({'A': [1, 2, np.nan, 4]})

# 跳過NaN計算
df_with_nan.mean()  # 輸出A列平均值:(1+2+4)/3 ≈ 2.333

# 包含NaN計算
df_with_nan.mean(skipna=False)  # 輸出NaN

2. 處理缺失值

處理缺失值是數(shù)據(jù)清洗的重要步驟,根據(jù)情況選擇刪除或填充。

df.dropna()         # 刪除含缺失值的整行
df.fillna(0)        # 用0填充缺失值
df.isna().sum()     # 統(tǒng)計每列的缺失值數(shù)量

3. 排序

排序可以快速發(fā)現(xiàn)數(shù)據(jù)的極值等等。

df.sort_values('Age', ascending=False)  # 按年齡降序排列

4. 分組聚合

分組聚合可以計算各組的統(tǒng)計量。

print(df.groupby('City')['Age'].mean())  # 按城市分組計算平均年齡

5. 應(yīng)用自定義函數(shù)

對DataFrame的行或列應(yīng)用自定義函數(shù)。

df['Age'].apply(lambda x: x * 2)  # 對Age列的值進行加倍

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)字典

# 默認返回 {列名: {索引: 值}} 的嵌套字典結(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])

# 縱向連接(默認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)連接(默認)
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'])

# 左連接(默認)
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)需要多個字段共同確定關(guān)聯(lián)關(guān)系時,可以使用多鍵合并。

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. 合并時處理重復(fù)列名

當(dāng)兩個DataFrame有相同列名但不是連接鍵時,添加后綴避免沖突。

# 合并時對重復(fù)列名添加后綴區(qū)分
result = pd.merge(left, right, on='key1', suffixes=('_left', '_right'))

6. 合并時添加指示列

indicator列會顯示每行是來自"left_only"、“right_only"還是"both”,便于追蹤合并結(jié)果。

# 合并后添加一列指示每行數(shù)據(jù)的來源
result = pd.merge(left, right, on='key1', how='outer', indicator=True)

六、DataFrame分割

1. 按行分割

行分割常用于將大數(shù)據(jù)集分成多個部分處理,或提取符合條件的子集。

# 創(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. 隨機分割

隨機分割常用于創(chuàng)建訓(xùn)練集和測試集,或進行隨機抽樣分析。

# 隨機抽取30%的數(shù)據(jù)
df_sample = df.sample(frac=0.3)

# 隨機抽取固定數(shù)量(5行)
df_sample_fixed = df.sample(n=5)

4. 分組后分割

分組后分割可以讓我們分別處理每個組的數(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)計計算:內(nèi)置 mean()、sum()、describe() 等方法,便捷。
  • 大數(shù)據(jù)處理:底層基于 NumPy/C,運算速度比純 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 更?。ǖ珷奚擞嬎闼俣龋?。
  • 需要定制化操作:Python 原生結(jié)構(gòu)可能更易控制。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

蒲江县| 林西县| 察隅县| 墨脱县| 闸北区| 石楼县| 琼海市| 永年县| 广德县| 长兴县| 彭山县| 南木林县| 舟曲县| 长宁区| 图片| 邹城市| 清涧县| 苍溪县| 双柏县| 宁强县| 宜章县| 福泉市| 高州市| 新安县| 永安市| 洪泽县| 曲沃县| 军事| 高碑店市| 衡水市| 新疆| 林周县| 肥西县| 专栏| 蒙阴县| 金山区| 常德市| 平阳县| 河间市| 仲巴县| 祁东县|