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

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

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

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ú)立的觀測(cè)值或數(shù)據(jù)記錄,例如一個(gè)人的完整信息
  • 列(Columns):每列代表一個(gè)特定的變量或特征,如"年齡"、"城市"等
  • 索引(Index):類似于行的身份證號(hào),用于快速定位和識(shí)別特定行

二、創(chuàng)建DataFrame

1. 從字典創(chuàng)建

從字典創(chuàng)建最直觀,字典的鍵自動(dòng)成為列名,值成為對(duì)應(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í),這種方法更合適。需要顯式指定列名,否則會(huì)自動(dòng)生成數(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對(duì)象
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()       # 對(duì)數(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)情況下只對(duì)數(shù)值列計(jì)算統(tǒng)計(jì)量,需要會(huì)對(duì)于非數(shù)值列計(jì)算,可以使用 include='all' 參數(shù)。

  • 對(duì)于數(shù)值列:計(jì)算計(jì)數(shù)(count)、均值(mean)、標(biāo)準(zhǔn)差(std)、最小值(min)、四分位數(shù)(25%、50%、75%)和最大值(max)
  • 對(duì)于非數(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()可以對(duì) 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ù)
)

對(duì)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())

對(duì)Series使用

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

常見場(chǎng)景

# 計(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ù)

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

df['Age'].apply(lambda x: x * 2)  # 對(duì)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ǎn)單的合并方法,適合結(jié)構(gòu)相同的數(shù)據(jù)集簡(jiǎn)單拼接。

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是基于索引的合并方法,適合索引有意義的場(chǎng)景。

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í)對(duì)重復(fù)列名添加后綴區(qū)分
result = pd.merge(left, right, on='key1', suffixes=('_left', '_right'))

6. 合并時(shí)添加指示列

indicator列會(huì)顯示每行是來自"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)練集和測(cè)試集,或進(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)建分組對(duì)象
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適合場(chǎng)景

  • 結(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 快(特別是百萬級(jí)數(shù)據(jù))。
  • 數(shù)據(jù)可視化支持:可直接對(duì)接 Matplotlib、Seaborn 等庫。
  • 數(shù)據(jù)庫/文件交互:支持直接讀取/寫入 CSV、Excel、SQL、JSON、Parquet 等格式,比手動(dòng)解析更簡(jiǎn)單。

原生數(shù)據(jù)結(jié)構(gòu)適合場(chǎng)景

  • 非結(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)文章

最新評(píng)論

赞皇县| 双鸭山市| 常德市| 浏阳市| 华池县| 安仁县| 定襄县| 宁都县| 武鸣县| 五家渠市| 休宁县| 岳阳县| 潢川县| 双流县| 开远市| 山丹县| 沙坪坝区| 洪雅县| 临武县| 辽宁省| 望都县| 庄河市| 三亚市| 玉山县| 盱眙县| 商城县| 桃园市| 龙川县| 吉安市| 绍兴市| 阿合奇县| 安顺市| 芜湖市| 临城县| 什邡市| 文登市| 锡林郭勒盟| 林甸县| 沭阳县| 班玛县| 如皋市|