Series :是 Pandas 中的一维数据结构,类似于一维数组或列表。
Series 可以存储任何数据类型,并且每个元素都有一个与之关联的标签,称为索引。 索引有助于对数据进行标记和命名,使得数据的访问更加方便和直观。
与传统的数组和列表不同,Pandas 的索引可以是任意数据类型,包括整数、字符串、日期等,不同元素的索引也可以是相同的。
在创建一个 Series 时,可以通过指定索引来为每个元素进行命名,这样一来就可以通过索引来访问和操作这些元素。
在访问 Series 中的元素时,同样需要使用索引来指定要访问的位置。
创建 Series 对象:
pandas.Series(data=None, index=None, dtype: Dtype = None, name=None, copy: bool=False,
fastpath: bool = False)
data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数
index:指定 Series 的索引,用于标识和访问数据。
索引可以是列表、数组、范围对象、标量值或其他 Series
如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引
dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型
name:指定 Series 的名称
copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。
示例
import pandas as pd
import numpy as np
# 创建Series(默认索引)
data = pd.Series([1, np.nan, 6])
# 创建Series(自建索引)
data = pd.Series([1, np.nan, 6], index=[0, 3, 4])
# 创建Series(通过字典直接创建带索引的数据)
data = pd.Series({0: 1, 3: np.nan, 4: 6})
print(data)
# 输出结果
0 1.0
3 NaN
4 6.0
dtype: float64
DataFrame :是 Pandas 中的二维数据结构,类似于 Excel 表格或 SQL 表,由行和列组成,并且可以存储不同类型的数据。
DataFrame 可以看做是一系列 Series 对象的集合,每个 Series 对象代表一列数据
在 DataFrame 中,索引的作用更加重要。除了可以为每一行和每一列指定索引外,DataFrame 还支持多级索引,也就是可以为行和列同时指定多个索引。这为多维数据的处理提供了更多的灵活性和功能性。
通过索引,可以轻松地从 DataFrame 中选择特定的行数和列数,可以通过指定行索引和列索引来选择任意子集的数据,也可以通过使用条件表达式来筛选满足特定条件的数据。
创建 DataFrame 对象:
pandas.DataFrame(data=None, index=None, dtype: Dtype = None, columns: Axes = None, copy: bool=False)
data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数
index:指定 Series 的索引,用于标识和访问数据。
索引可以是列表、数组、范围对象、标量值或其他 Series
如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引
dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型
columns:指定 DataFrame 的列标签,用于标识和访问列。
列标签可以是列表、数组、范围对象、标量值或其他 Series。
如果没有显式指定列标签,Pandas 将自动生成默认的整数列标签。
copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。
示例:
import pandas as pd
data = {'name': ['John', 'Emma', 'Mike', 'Lisa'],
'age': [28, 24, 32, 35],
'city': ['New York', 'London', 'Paris', 'Tokyo']}
df1 = pd.DataFrame(data)
# 通过columns指定DataFrame的列索引
data = [[1,'Bob', 24, 'American'],[2, 'Nancy', 23, 'Australia'],[3, 'Lili', 22, 'China'],[4, 'Leo', 27, 'M78'],[5, 'David', 24, 'moon']]
df2 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from',])
# 自定义索引
df3 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from'], index=['a','b','c','d','e'])
# df1 输出结果
name age city
0 John 28 New York
1 Emma 24 London
2 Mike 32 Paris
3 Lisa 35 Tokyo
# df3 输出结果
serial name age from
a 1 Bob 24 American
b 2 Nancy 23 Australia
c 3 Lili 22 China
d 4 Leo 27 M78
e 5 David 24 moon
Pandas 可以从多种数据源导入数据,包括 CSV、Excel、SQL 数据库、JSON 等,并且可以将数据导出到这些格式。
pandas.read_csv() :从 CSV 文件导入数据,返回一个 DataFrame 对象(df)
参数说明:
pandas.read_excel() :从 Excel 文件导入数据,返回一个 DataFrame 对象(df)
参数说明:
df.to_csv() :将数据导出为 CSV 文件
参数说明:
df.to_excel() :将数据导出为 Excel 文件
参数说明:
示例
import pandas as pd
# 从CSV文件导入数据
df = pd.read_csv('data.csv')
# 将数据导出到Excel文件
df.to_excel('data.xlsx', index=False)
Pandas 提供了各种方法来处理缺失数据、重复数据、异常数据,以及进行数据变换、筛选和合并不同数据源的数据,包括连接、合并和联接等操作。
df.isnull() 和 df.notnull() :检测缺失值
df.drop() :删除行或列
df.dropna() :删除包含缺失值的行
df.drop_duplicates() :删除重复行
df.fillna(value) :填充缺失值
df.apply(func) :应用函数到行或列
df.groupby(‘column_name’).mean() :分组数据(聚合)
df.pivot_table() :创建透视表
df.melt() :将宽格式数据转换为长格式
示例
# 聚合操作
data = [[1,'Bob', 24, 'high-school'],[2, 'Nancy', 23, 'college'],[3, 'Lili', 22, 'college']]
df = pd.DataFrame(data, columns=['serial', 'name', 'age', 'grade'], index=['a','b','c'])
# 聚合,按grade分组,并计算分组后的平均年龄
xdf = df.groupby('grade')['age'].mean()
# 透视表
pd.pivot_table(df, values='value_column', index='index_column', columns='column_to_pivot')
# 应用自定义函数
df.apply(custom_function, axis=1)
pd.concat() :用于合并行(纵向堆叠)或列(横向连接)数据,通常用于连接不同数据集的行或列,但不执行基于列的合并,不对数据重复值进行检查或处理,只是简单地将数据堆叠在一起
主要参数说明:
objs :要合并的数据对象列表,可以是 DataFrame 或 Series 的列表。唯一的必选参数
axis :指定合并的轴方向。默认为 0
,表示按行合并(纵向堆叠),如果设置为 1
,表示按列合并(横向连接)
join :指定连接的方式,默认为 'outer'
。可以取以下值:
'outer'
:执行外连接,保留所有的行或列,并使用缺失值填充不存在的数据。'inner'
:执行内连接,只保留共有的行或列。ignore_index :默认为 False
。如果设置为 True
,将忽略原始索引,创建新的连续整数索引。
keys :用于创建层次化索引的标签,可以是字符串、列表或数组。如果提供了 keys,将创建 MultiIndex。
**适用场景:**主要用于简单的数据堆叠操作,合并来自不同来源或处理方式的数据,如将多个相似的数据集按行堆叠在一起,或者将不同数据集的列拼接在一起
pd.merge() :用于基于列的合并,类似于 SQL 中的 JOIN 操作,用于将两个或多个数据框(DataFrame)根据一个或多个共享的列进行连接。
pd.merge()
通常会检查连接列中是否有重复值,并根据连接类型执行不同的处理操作,如 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN。
主要参数说明:
'inner'
。可以取以下值:
'inner'
:执行内连接,只保留两个 DataFrame 中共有的行。'outer'
:执行外连接,保留两个 DataFrame 中的所有行,缺失值用 NaN 填充。'left'
:执行左连接,保留左侧 DataFrame 中的所有行,右侧 DataFrame 中没有匹配的行用 NaN 填充。'right'
:执行右连接,保留右侧 DataFrame 中的所有行,左侧 DataFrame 中没有匹配的行用 NaN 填充。False
。如果设置为 True
,则使用左侧 DataFrame 的索引作为连接键。False
。如果设置为 True
,则使用右侧 DataFrame 的索引作为连接键。('_x', '_y')
。用于处理重叠列名的后缀字符串元组,可以指定在列名冲突时添加到列名末尾。False
。如果设置为 True
,在合并后对结果进行排序。True
。如果设置为 False
,尝试在不复制数据的情况下执行连接操作,可以提高性能。**适用场景:**主要用于更复杂的基于列的数据连接和合并操作,基于共享列合并来自不同数据集的数据,通常用于数据关联、数据连接和数据库风格的合并操作。
pd.join() :函数根据索引或列的值进行连接
df.split() :将包含多个值的单个列拆分成多个列,从而使数据更加规整和易于处理
示例:
# 合并两个DataFrame
merged_df = pd.concat([df1, df2], axis=0)
# 数据库风格的连接
merged_df = pd.merge(df1, df2, on='key_column')
df[‘column_name’] :选择单列
df[[‘col1’, ‘col2’]] :选择多列
df.loc[row_label] :使用标签选择行
df.iloc[row_index] :使用整数索引选择行
df.query() :使用条件查询数据
示例:
# 选择列:可以使用列名或列索引来选择列。
df['name']
# 选择行:可以使用行索引来选择行。
df.loc['a']
# 切片方式访问。访问第二行到第三行数据
df.iloc[1:3]
df[df[‘column_name’] > value] :按条件筛选行
df[(condition1) & (condition2)] :使用逻辑运算符筛选行
示例
# 过滤行:可以使用条件表达式来过滤行。
df[df['age'] > 30]
df.sort_values(‘column_name’) :按列值排序
df.sort_index() :按索引排序
df.rank() :为数据分配排名
示例:
df = df.sort_values(by='age', ascending=False)
Pandas 对时间序列数据提供了强大的支持,包括日期解析、时间索引和滚动窗口操作。
pd.to_datetime(arg, format) :将字符串转换为日期时间类型
df.resample() :重采样时间序列数据
df.shift(periods, freq) :平移时间序列数据
示例:
# 解析日期列
df['date_column'] = pd.to_datetime(df['date_column'])
# 创建时间索引
df.set_index('date_column', inplace=True)
# 滚动窗口操作
df['rolling_mean'] = df['value_column'].rolling(window=3).mean()
Pandas 整合了 Matplotlib 库,可以轻松地可视化数据。
df.plot() :绘制数据可视化图表
df.hist() :绘制直方图
df.boxplot() :绘制箱线图
示例:
import matplotlib.pyplot as plt
# 创建柱状图
df['column_name'].plot(kind='bar')
# 创建散点图
df.plot.scatter(x='x_column', y='y_column')
# 更多的可视化选项可以结合使用 Pandas 和 Matplotlib
Pandas 的多级索引功能非常强大,它允许在一个 DataFrame 中创建复杂的层次结构索引,从而更灵活地组织和分析数据。
一个常见的应用场景是使用多级索引来表示时间序列数据,比如将年份和季度作为索引的两个层级。
通过创建多级索引,可以将数据按照不同的层级进行划分和聚合。
例如,可以根据年份来对数据进行分组,然后在每个年份内再按照季度进行分组。这样,可以更方便地进行各种统计分析,比如计算每个季度的平均值、总和等。
在创建多级索引时,可以使用 Pandas 的 MultiIndex 类来指定索引的层级和标签。
通过指定层级的名称和对应的标签值,可以轻松地创建一个具有多级索引的 DataFrame。
使用多级索引可以带来很多好处,比如提高数据的查询效率、简化数据的操作和分析等。
但同时,也需要注意在使用多级索引时,要避免索引混淆和数据结构复杂度过高的问题。
因此,在使用多级索引时,需要根据具体的需求和数据特点来灵活应用。
示例:
import pandas as pd
# 创建多级索引
index = pd.MultiIndex.from_tuples([('2019', 'Q1'), ('2019', 'Q2'), ('2020', 'Q1'), ('2020', 'Q2')])
data = pd.DataFrame({'Sales': [100, 200, 150, 250]}, index=index)
# 查询特定季度的销售数据
print(data.loc[('2020', 'Q1')])
print("==================")
# 查询特定年份的销售数据
print(data.loc['2020'])
# 输出结果:
Sales 150
Name: (2020, Q1), dtype: int64
==================
Sales
Q1 150
Q2 250
透视表是一种根据数据中的一个或多个列创建汇总表格的方法。
Pandas 提供了 pivot_table()
函数,可以方便地对数据进行聚合和分析。
通过 pivot_table()
函数,可以指定一个或多个列作为行索引,另一个或多个列作为列索引,然后根据指定的聚合函数对数据进行汇总。这样,就可以快速计算出各个行和列对应的统计量,比如平均值、总和、计数等。
Pandas 的透视表功能提供了一种方便、灵活的数据聚合和分析方法,可以帮助更好地理解和利用数据。
透视表的好处在于它提供了一种直观、简洁的方式来查看和分析数据。
通过透视表,可以轻松地对数据进行切片、切块和筛选,从而更深入地了解数据的特征和关系。
使用透视表时,可以根据具体的需求选择合适的聚合函数、行列索引和筛选条件,以获取想要的分析结果。
透视表不仅适用于单个 DataFrame,还可以用于多个 DataFrame 的合并和分析。
示例:
import pandas as pd
# 创建一个包含销售数据的DataFrame
data = pd.DataFrame({'Year': ['2019', '2019', '2020', '2020'],
'Quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
'Product': ['A', 'B', 'A', 'B'],
'Sales': [100, 200, 150, 250]})
# 创建透视表
pivot_table = data.pivot_table(index='Year', columns='Quarter', values='Sales', aggfunc='sum')
# 打印透视表
print(pivot_table)
# 输出结果
Quarter Q1 Q2
Year
2019 100 200
2020 150 250
在处理时间序列数据方面,Pandas 提供了灵活且高效的功能。
它的日期和时间处理功能包括日期范围生成、日期索引、日期加减运算、日期格式化等。可以轻松地创建日期范围,并使用这些日期作为数据的索引,便于对时间序列数据进行操作和分析。
Pandas 还支持重采样操作,可以将时间序列数据从一个频率转换为另一个频率。
例如,可以将按天采样的数据转换为按月采样的数据,或者将按小时采样的数据转换为按分钟采样的数据。重采样功能允许根据需要灵活地调整数据的粒度和频率。
Pandas 还提供了滑动窗口操作,可以在时间序列数据上执行滑动窗口统计计算。
可以定义窗口的大小和滑动的步长,并针对窗口内的数据进行汇总、聚合或其他计算操作。这对于处理时间序列数据中的移动平均值、滚动求和等任务非常有用。
示例:
import pandas as pd
# 创建一个包含时间序列数据的DataFrame
df = pd.DataFrame({'Date': pd.date_range(start='2020-01-01', periods=10),
'Sales': [100, 200, 150, 250, 180, 120, 300, 350, 400, 250]})
# 将日期列设置为索引
df.set_index('Date', inplace=True)
# 计算每周销售总额
weekly_sales = df.resample('W').sum()
# 打印每周销售总额
print(weekly_sales)
当使用 Pandas 处理 Excel 文件时,可以使用 read_excel()
函数来读取 Excel 数据,并将其加载到一个 DataFrame 中。
然后可以对读取的数据进行各种操作和处理,例如筛选特定列的数据、根据条件筛选数据、对数据进行排序,在 DataFrame 中添加了新的列等等。
示例:
import pandas as pd
# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 显示DataFrame的前几行数据
print(df.head())
# 筛选特定列数据
selected_columns = ['Name', 'Age']
filtered_data = df[selected_columns]
# 按条件筛选数据
condition = df['Age'] > 25
filtered_data = df[condition]
# 数据排序
sorted_data = df.sort_values(by='Age', ascending=False)
# 添加新列
df['Gender'] = ['Male', 'Female', 'Male', 'Female', 'Male']
# 写入到新的Excel文件
df.to_excel('new_data.xlsx', index=False)