【python 第三方库】pandas

2024-01-25 00:00:00

目录:

pandas 模块介绍

pandas 用于数据处理和分析,提供了 DataFrame 和 Series 两种数据结构,DataFrame 用于处理表格数据/二维数据,Series 用于处理一维数据。在处理金融、统计、社会科学、工程等领域经常使用。

$ pip3 install pandas

Series 介绍

Series 是一种类似于一维数组的对象,由一组数据(值数组)和一组与之相关的数据标签(索引)组成。它可以容纳任何数据类型(整数、字符串、浮点数、Python对象等)。

import pandas as pd
import numpy as np

# 通过列表创建,不指定索引则默认生成 0, 1, 2... 索引
s1 = pd.Series([1, 2, 3, 4])
print(f's1:\n{s1}')
# 输出:
# 0    1
# 1    2
# 2    3
# 3    4
# dtype: int64

# 通过列表创建并指定索引
s2 = pd.Series([11, 12, 13, 14], index=['a', 'b', 'c', 'd'])
print(f's2:\n{s2}')
# 输出:
# a    11
# b    12
# c    13
# d    14
# dtype: int64

# 通过 NumPy 数组创建
s3 = pd.Series(np.arange(3))
print(f's3:\n{s3}')

# 通过字典创建,字典的键将成为索引
dic = {'calvin': 7, 'kobe': 24}
s4 = pd.Series(dic)
print(f's4:\n{s4}')

常见属性

import pandas as pd

s = pd.Series([1, 2, 3, 4])

print(s.values) # 值数组: [1 2 3 4]
print(s.index) # 索引数组: RangeIndex(start=0, stop=4, step=1)
print(s.name) # 序列的名称: None
print(s.dtype) # 数据类型: int64

DataFrame 介绍

DataFrame 是一个二维的、表格型的数据结构,类似于电子表格或 SQL 数据库中的表。它由行和列组成,每列可以包含不同的数据类型。DataFrame 是 Pandas 中最常用、功能最强大的对象。

import pandas as pd
import numpy as np

# 从字典创建(最常用)
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['NYC', 'LA', 'Chicago']}
df1 = pd.DataFrame(data)
print(f'df1:\n{df1}')

# 从列表的列表创建,并指定列名
data_list = [['Alice', 25], ['Bob', 30], ['Charlie', 35]]
df2 = pd.DataFrame(data_list, columns=['Name', 'Age'])
print(f'df2:\n{df2}')

# 从 Series 的字典创建
data_series = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
               'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df3 = pd.DataFrame(data_series)
print(f'df3:\n{df3}')

# 创建带指定索引和列名的 DataFrame
dates = pd.date_range('20230101', periods=6)
df4 = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(f'df4:\n{df4}')

常见属性

import pandas as pd
import numpy as np

# 从字典创建(最常用)
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'City': ['NYC', 'LA', 'Chicago']}
df = pd.DataFrame(data)

print(df.columns) # 列索引: Index(['Name', 'Age', 'City'], dtype='object')
print(df.index) # 行索引: RangeIndex(start=0, stop=3, step=1)
print(df.values) # 值二维数组
print(df.dtypes) # 每列数据类型
print(df.shape) # 数据形状: (3, 3)
print(df.T) # 行和列转置

DataFrame 快速概览

在数据处理前,快速查看数据概览是重要一步。

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C': ['a', 'b', 'c', 'd']})

print(df.head(3))       # 查看前 3 行,默认 5 行
print()
print(df.tail(2))       # 查看后 2 行,默认 5 行
print()
print(df.sample(1))     # 随机查看 1 行
print()
print(df.info())        # 显示索引、列数据类型、非空值数量等信息
print()
print(df.describe())    # 生成描述性统计摘要(针对数值列)
print()
print(df.shape)         # 输出 (4, 3)
print()
print(df.columns.tolist()) # 输出 ['A', 'B', 'C']
print()
print(df['C'].value_counts()) # 查看某列唯一值及计数

列选择

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C': ['a', 'b', 'c', 'd']})

# 选择单列,返回 Series
series_a = df['A'] # 只选择 A 列
print(series_a)
# 0    1
# 1    2
# 2    3
# 3    4

# 选择多列,返回DataFrame
df_subset = df[['A', 'C']] # 只选择 A 和 C 列
print(df_subset)
# Name: A, dtype: int64
#    A  C
# 0  1  a
# 1  2  b
# 2  3  c
# 3  4  d

行选择

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C': ['a', 'b', 'c', 'd']})

# 使用 .iloc[] 基于整数位置选择
print(df.iloc) # 第一行
# 输出: <pandas.core.indexing._iLocIndexer object at 0x118bc2ad0>

print(df.iloc[1:3]) # 第 2 到第 3 行(切片)
#    A   B  C
# 1  2  20  b
# 2  3  30  c

print(df.iloc[[0, 2]]) # 第 1 行和第 3 行(花式索引)
#    A   B  C
# 0  1  10  a
# 2  3  30  c

# 使用 .loc[] 基于标签选择
df_indexed = df.set_index('C')
print(df_indexed.loc['a'])          # 索引标签为 'a' 的行
# A     1
# B    10
# Name: a, dtype: int64

print(df_indexed.loc[['a', 'c']])   # 索引标签为 'a' 和 'c' 的行
#    A   B
# C       
# a  1  10
# c  3  30

增删列/行

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 30, 40], 'C': ['a', 'b', 'c', 'd']})
print(f'df:\n{df}')
#    A   B  C
# 0  1  10  a
# 1  2  20  b
# 2  3  30  c
# 3  4  40  d

# 增加列
df['D'] = df['A'] * 2
df['Category'] = pd.cut(df['A'], bins=2, labels=['Low', 'High']) # 分箱
print(f'df:\n{df}')
#    A   B  C  D Category
# 0  1  10  a  2      Low
# 1  2  20  b  4      Low
# 2  3  30  c  6     High
# 3  4  40  d  8     High

# 删除列
df_dropped = df.drop(['D'], axis=1) # axis=1 表示列
print(f'df_dropped:\n{df_dropped}')
#    A   B  C Category
# 0  1  10  a      Low
# 1  2  20  b      Low
# 2  3  30  c     High
# 3  4  40  d     High

# 删除行
df_dropped_row = df.drop([0, 1], axis=0) # axis=0 表示行,或省略axis
print(f'df_dropped_row:\n{df_dropped_row}')
#    A   B  C  D Category
# 2  3  30  c  6     High
# 3  4  40  d  8     High

print(f'df:\n{df}')
#    A   B  C  D Category
# 0  1  10  a  2      Low
# 1  2  20  b  4      Low
# 2  3  30  c  6     High
# 3  4  40  d  8     High

# 添加行(通常使用 concat)
new_row = pd.DataFrame({'A': [5], 'B': [50], 'C': ['e']})
df_appended = pd.concat([df, new_row], ignore_index=True)
print(f'df_appended:\n{df_appended}')
#    A   B  C    D Category
# 0  1  10  a  2.0      Low
# 1  2  20  b  4.0      Low
# 2  3  30  c  6.0     High
# 3  4  40  d  8.0     High
# 4  5  50  e  NaN      NaN

处理缺失值

# 检测缺失值
print(df.isnull().sum()) # 每列缺失值数量
print(df[df['A'].isnull()]) # 提取某列含有空值的行

# 删除缺失值
df_dropna = df.dropna() # 删除任何包含 NaN 的行
df_dropna_col = df.dropna(axis=1) # 删除任何包含 NaN 的列

# 填充缺失值
df_filled = df.fillna(0) # 用 0 填充
df_filled_mean = df['A'].fillna(df['A'].mean()) # 用均值填充
df_filled_mode = df['C'].fillna(df['C'].mode()) # 用众数填充

数据类型转换

df['A'] = df['A'].astype('float64')
# 更安全的数值转换,错误处理
df['B'] = pd.to_numeric(df['B'], errors='coerce') # 无法转换的变为 NaN

去重

# 删除重复行
df_dedup = df.drop_duplicates()
df_dedup_subset = df.drop_duplicates(subset=['C']) # 基于特定列去重

排序

df_sorted = df.sort_values('A', ascending=False) # 按 A 列降序
df_sorted_multi = df.sort_values(['A', 'B']) # 按多列排序

文件操作

Pandas 支持从多种数据源读写数据。

# 读取数据
df_csv = pd.read_csv('filename.csv')
df_excel = pd.read_excel('filename.xlsx')
df_sql = pd.read_sql('SELECT * FROM table_name', connection_object)

# 写入数据
df.to_csv('output.csv', index=False) # 不保存行索引
df.to_excel('output.xlsx')
df.to_sql('table_name', connection_object, if_exists='replace')

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: