Pandas介绍
Pandas 是一个基于 NumPy 的 Python 数据处理库,提供了高效的数据结构和数据分析工具,使得在处理和分析结构化数据变得更加简单和快速。
以下是 Pandas 的一些主要功能和特点:
- 数据结构:Pandas 提供了两种主要的数据结构:Series 和 DataFrame。
- Series 是一维标记数组,类似于带有标签的 NumPy 数组。它支持整数、浮点数、字符串等各种数据类型,并且可以根据位置或标签进行索引。
- DataFrame 是一个二维标签数据结构,类似于表格或电子表格。它由多个行和列组成,每列可以包含不同的数据类型。DataFrame 可以理解为多个 Series 对象的集合。
- 数据处理和操作:Pandas 提供了丰富的函数和方法来进行数据处理和操作。
- 数据清洗:Pandas 提供了各种用于处理缺失值、重复值和异常值的函数,如填充、删除和替换等。
- 数据过滤和选择:Pandas 提供了灵活的方式来选择、筛选和过滤数据,可以根据条件、标签或位置进行选择。
- 数据排序和排名:Pandas 允许对数据进行排序并排名,包括按照某列或多列进行排序。
- 数据统计和聚合:Pandas 提供了丰富的统计和聚合函数,如求和、均值、中位数、方差、分组等。
- 数据读写:Pandas 可以轻松地读取和写入各种数据格式,包括 CSV、Excel、SQL 数据库、JSON、HDF5 等。
- 时间序列数据处理:Pandas 对于时间序列数据的处理非常强大,提供了许多用于处理时间和日期的功能和方法。
- 数据可视化:Pandas 结合了 Matplotlib 库,可以通过简单的方法进行基本的数据可视化,如绘制折线图、柱状图和散点图等。
总之,Pandas 是一个功能强大且灵活的数据处理工具,它使得在 Python 中进行数据清洗、处理和分析变得更加容易和高效。它广泛应用于数据科学、机器学习、金融分析和其他数据相关的领域。
Pandas基础
import pandas as pd
print(pd.__version__) #2.1.0
Series
创建
1.从列表或数组创建
s1 = pd.Series([1,3,2])
print(s1)
print(s1.index)
"""
0 1
1 3
2 2
dtype: int64
RangeIndex(start=0, stop=3, step=1)
"""
2.从字典创建:
s2 = pd.Series({'长沙':1.1,'株洲':1.2})
s2.name = '城市'
print(s2)
print(s2.index)
"""
长沙 1.1
株洲 1.2
Name: 城市, dtype: float64
Index(['长沙', '株洲'], dtype='object')
"""
访问数据
series[0] # 访问第一个元素
series['a'] # 根据标签访问元素
增加元素
- 使用索引赋值:通过指定索引,可以直接为 Series 添加新的元素。
series['d'] = 60 # 在索引 'd' 处添加元素 60
- 使用
pd.concat()
方法,创建一个新的 Seriesnew_series
。
data = [10, 20]
series = pd.Series(data)
new_element = 30
new_series = pd.concat([series, pd.Series([new_element])])
print(new_series)
- 使用
pd._append()
方法
series = pd.Series({'长沙':1.1,'株洲':1.2})
new_series = series._append(pd.Series({'湘潭':1.3}))
print(new_series)
删除操作
- 使用
drop()
方法删除指定索引的元素(生成新的 Series)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2 # 要删除的元素的索引
new_series = series.drop(index_to_drop)
print(new_series)
- 使用索引切片删除指定位置的元素(生成新的 Series)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2 # 要删除的元素的索引
new_series = series[series.index != index_to_drop]
print(new_series)
- 使用
del
关键字删除指定位置的元素(对原始的 Series 进行修改)
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
index_to_drop = 2 # 要删除的元素的索引
del series[index_to_drop]
print(series)
切片操作
series[1:4] # 获取索引 1 至索引 3 的元素
矢量化操作
Pandas 具有广播功能,使得可以在整个 Series 中进行矢量化操作。
series * 2 # 将 Series 中的每个元素乘以 2
过滤操作
series[series > 20] # 返回大于 20 的元素
其他常用操作
求和、均值、计数、查找唯一值等操作也是很常见的,可以使用相应的方法进行处理。
series.sum() # 求和
series.mean() # 均值
series.count() # 计数
series.unique() # 查找唯一值
DataFrame
DataFrame 是一个二维的、表格型的数据结构,可以容纳不同数据类型的列。
创建
data = [10, 20, 30, 40, 50]
series = pd.Series(data)
df = pd.DataFrame(series, columns=['Column Name'])
print(df)
"""
Column Name
0 10
1 20
2 30
"""
df1 = pd.DataFrame([['⼩红', 27, 1.63],['⼩张', 30, 1.78]],
columns=['姓名','年龄','身⾼'],
index=['index0', 'index1'])
print(df1)
"""
姓名 年龄 身⾼
index0 ⼩红 27 1.63
index1 ⼩张 30 1.78
"""
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
print(df)
"""
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
3 David 40 80000
"""
#导入csv文件
df = pd.read_csv('supplier_factory_info_test.csv')
print(df)
查看数据
- 使用
head()
方法查看前几行数据,默认为前 5 行。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 查看前 3 行数据
print(df.head(3))
输出结果为:
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
增加数据
- 使用
loc
或iloc
来新增一行或多行数据。
# 创建空的 DataFrame
df = pd.DataFrame(columns=['Name', 'Age'])
# 增加一行数据
df.loc[0] = ['Alice', 25]
# 增加多行数据
df.loc[1] = ['Bob', 30]
df.loc[2] = ['Charlie', 35]
print(df)
输出结果为:
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
- 使用._append()添加数据
df1 = pd.DataFrame([['⼩红', 27, 1.63],['⼩张', 30, 1.78]],
columns=['姓名','年龄','身⾼'],
index=['index0', 'index1'])
s1 = pd.Series({"姓名":"⼩王", "年龄":25, "身⾼":1.67})
s1.name = "index2"
df2 = df1._append(s1)
print(df2)
输出结果为:
姓名 年龄 身⾼
index0 ⼩红 27 1.63
index1 ⼩张 30 1.78
index2 ⼩王 25 1.67
删除数据
- 使用
drop()
方法删除指定行或列的数据。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# 删除指定行
df = df.drop(1) # 删除索引为 1 的行
# 删除指定列
df = df.drop('Age', axis=1) # 删除名为 'Age' 的列
print(df)
输出结果为:
Name
0 Alice
2 Charlie
访问列
- 使用列名可以直接访问对应的列数据。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 访问 Name 列数据
print(df['Name'])
输出结果为:
0 Alice
1 Bob
2 Charlie
3 David
Name: Name, dtype: object
描述性统计
- 使用
describe()
方法可以输出数据的基本统计信息。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 描述性统计
print(df.describe())
输出结果为:
Age Salary
count 4.000000 4.00000
mean 32.500000 65000.00000
std 6.454972 12909.94449
min 25.000000 50000.00000
25% 28.750000 57500.00000
50% 32.500000 65000.00000
75% 36.250000 72500.00000
max 40.000000 80000.00000
数据筛选
- 使用条件筛选可以选择符合特定条件的数据行。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 筛选 Age 大于 30 的数据行
filtered_df = df[df['Age'] > 30]
print(filtered_df)
输出结果为:
Name Age Salary
2 Charlie 35 70000
3 David 40 80000
排序
- 使用
sort_values()
方法可以按照指定的列进行排序。
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'Salary': [50000, 60000, 70000, 80000]}
df = pd.DataFrame(data)
# 按照 Salary 列进行升序排序
sorted_df = df.sort_values('Salary')
print(sorted_df)
输出结果为:
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
3 David 40 80000
DataFrame行级遍历
iterrows() 方法
iterrows()
方法可以返回一个迭代器,通过迭代器可以遍历每一行的索引和数据。示例如下:
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# 使用 iterrows() 进行行级遍历
for index, row in df.iterrows():
print(f"Index: {index}, Name: {row['Name']}, Age: {row['Age']}")
输出结果为:
Index: 0, Name: Alice, Age: 25
Index: 1, Name: Bob, Age: 30
Index: 2, Name: Charlie, Age: 35
注意:iterrows()
方法返回的是每行的索引和一个包含行数据的 Series 对象。
itertuples() 方法
itertuples()
方法返回一个迭代器,通过迭代器可以遍历每一行数据的命名元组。示例如下:
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# 使用 itertuples() 进行行级遍历
for row in df.itertuples(index=False):
print(f"Name: {row.Name}, Age: {row.Age}")
输出结果为:
Name: Alice, Age: 25
Name: Bob, Age: 30
Name: Charlie, Age: 35
注意:itertuples()
方法返回的是一个命名元组对象,可以通过属性访问每行的数据。
操纵DataFrame的索引
set_index()方法
set_index()
方法可以通过指定某一列作为新的索引。示例如下:
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# 使用 set_index() 设置新的索引列
df = df.set_index('Name')
print(df)
输出结果为:
Age
Name
Alice 25
Bob 30
Charlie 35
reset_index() 方法
reset_index()
方法可以重置索引,将当前索引列变为普通列,并重新生成默认的数字索引。示例如下:
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)
# 使用 reset_index() 重置索引
df = df.reset_index()
print(df)
输出结果为:
Name Age
0 Alice 25
1 Bob 30
2 Charlie 35
index Name Age
0 0 Alice 25
1 1 Bob 30
2 2 Charlie 35
直接操作索引属性
可以直接修改 DataFrame 的索引属性 index
来改变索引的值。示例如下:
# 创建 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# 修改索引值
df.index = ['a', 'b', 'c']
print(df)
输出结果为:
Name Age
a Alice 25
b Bob 30
c Charlie 35
DataFrame的列自动对齐
当进行 pandas 的列级操作时(如相加、相减、相乘等),Pandas 利用列的标签在操作过程中对齐数据。如果两个 DataFrame 具有不同的索引,Pandas 会首先将它们重新索引以对齐行,然后再根据列的标签对齐数据。
# 创建两个 DataFrame
data1 = {'A': [1, 2, 3],
'B': [4, 5, 6]}
df1 = pd.DataFrame(data1)
data2 = {'A': [7, 8, 9],
'C': [10, 11, 12]}
df2 = pd.DataFrame(data2)
# 对两个 DataFrame 进行相加操作
df_sum = df1 + df2
print(df_sum)
输出结果为:
A B C
0 8 NaN NaN
1 10 NaN NaN
2 12 NaN NaN
没有匹配的行或列时,Pandas 使用 NaN(缺失值)来填充。
DataFrame 分组操作
按照单个列进行分组
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
'Age': [25, 30, 35, 28, 32],
'City': ['New York', 'Paris', 'London', 'Tokyo', 'Paris'],
'Salary': [5000, 6000, 7000, 5500, 6500]}
df = pd.DataFrame(data)
# 按照 'Name' 列进行分组,并计算每个分组的平均年龄和平均工资
grouped = df.groupby('Name')
result = grouped[['Age','Salary']].mean()
print(result)
输出结果为:
Age Salary
Name
Alice 26.5 5250.0
Bob 31.0 6250.0
Charlie 35.0 7000.0
传递多个列名进行多层次的分组
# 创建一个示例 DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'Alice', 'Bob'],
'Age': [25, 30, 35, 28, 32],
'City': ['New York', 'Paris', 'London', 'Tokyo', 'Paris'],
'Salary': [5000, 6000, 7000, 5500, 6500]}
df = pd.DataFrame(data)
#传递多个列名以进行多层次的分组
grouped = df.groupby(['Name', 'City'])
result = grouped.mean()
print(result)
输出结果为:
Age Salary
Name City
Alice New York 25.0 5000.0
Tokyo 28.0 5500.0
Bob Paris 31.0 6250.0
Charlie London 35.0 7000.0
该代码将 DataFrame 按照 ‘Name’ 列和 ‘City’ 列进行分组,并计算每个分组的平均值。
在进行分组后,还可以对每个分组应用其他函数或方法(如 sum()
、count()
、max()
、min()
等),以生成更多的汇总统计信息。
使用主键连接2个DataFrame
merge()函数
df1 = pd.DataFrame({'地区':['北京','⼭东','天津'],'⼈⼝':[1.2, 1.1, 0.7]})
df2 = pd.DataFrame({'地区':['北京','⼭东', '陕⻄'],'省会':['北京', '济南', '⻄安']})
merged_df = df1.merge(df2, on='地区')
print(merged_df)
输出结果为:
地区 ⼈⼝ 省会
0 北京 1.2 北京
1 ⼭东 1.1 济南
join()函数
df1 = pd.DataFrame({'地区':['北京','⼭东','天津'],'⼈⼝':[1.2, 1.1, 0.7]})
df2 = pd.DataFrame({'地区':['北京','⼭东', '陕⻄'],'省会':['北京', '济南', '⻄安']})
joined_df = df1.join(df2, lsuffix='_左表', rsuffix='_右表')
print(joined_df)
输出结果为:
地区_左表 ⼈⼝ 地区_右表 省会
0 北京 1.2 北京 北京
1 ⼭东 1.1 ⼭东 济南
2 天津 0.7 陕⻄ ⻄安
注意:.join()
方法是针对索引进行连接的,而不是基于指定的列进行连接。如果希望基于指定的列进行连接,使用.merge()
方法。
数据透视
.pivot_table()
# 创建一个DataFrame
data = {
'城市': ['北京', '上海', '北京', '上海', '北京', '上海'],
'部门': ['销售', '销售', '财务', '财务', '人力资源', '人力资源'],
'员工': ['小明', '小红', '小李', '小王', '小张', '小陈'],
'销售额': [10000, 15000, 8000, 12000, 9000, 11000]
}
df = pd.DataFrame(data)
print(df)
# 进行数据透视
pivot_df = df.pivot_table(values='销售额', index='城市', columns='部门', aggfunc='sum')
print(pivot_df)
输出结果为:
城市 部门 员工 销售额
0 北京 销售 小明 10000
1 上海 销售 小红 15000
2 北京 财务 小李 8000
3 上海 财务 小王 12000
4 北京 人力资源 小张 9000
5 上海 人力资源 小陈 11000
部门 人力资源 财务 销售
城市
上海 11000 12000 15000
北京 9000 8000 10000