目录
Pandas 是一个 Python 数据分析库,提供快速、灵活和表达力强的数据结构,旨在使“关系”或“标签”数据的操作既简单又直观。Pandas 适用于多种类型的数据,包括:
- 与 SQL 或 Excel 表类似的表格数据,具有行和列。
- 有序和无序(不固定)的时间序列数据。 -任意矩阵数据(均匀类型)与异构数据。
- 其他任意形式的统计数据集。
Pandas 的两个主要数据结构是 Series
(一维数组)和 DataFrame
(二维表)。这两种数据结构使得在 Python 中处理数据变得非常简单和直观。
主要特点
-
数据导入和导出:Pandas 支持多种文件格式,如 CSV、Excel、HDF5 和 SQL 数据库,可以轻松地导入和导出数据。
-
数据清洗和准备:Pandas 提供了各种功能来处理缺失数据、重复数据、数据类型转换等。
-
数据操作:Pandas 允许你进行数据集的切片、切块、聚合、透视和重塑。
-
数据分析:Pandas 提供了丰富的函数库来进行描述性统计和复杂的分析。
-
时间序列分析:Pandas 有专门用于处理时间序列数据的功能,如日期范围生成、频率转换、移动窗口统计等。
-
性能优化:Pandas 是高效的,可以轻松处理大型数据集。
一、pandas的索引切片
创建DataFrame
import pandas as pd
df = pd.DataFrame([['W', 23, 90], ['M', 35, 75], ['W', 18, 82], ['M', 14, 93]],
columns=['gender', 'age', 'score'],
index=['小强', '小亮', '小刚', '小明'])
loc和iloc的用法
loc
允许你通过行标签和列名进行索引。它可以接受两个单个的索引器或一个由两个索引器组成的元组。
iloc
允许你通过行号和列号进行索引,它使用整数索引,范围从0到len(df.index)
-1(对于行)和len(df.columns)
-1(对于列)。
"""loc 和 iloc的用法"""
'''loc'''
# 取所有行所有列
print(df.loc[:, :])
# 取某一行某一列
print(df.loc['小红', 'age'])
# 取某一行所有列
print(df.loc['小红', :])
# 取所有行一列
print(df.loc[:, 'age'])
# 取所有行前两列
print(df.loc[:, :'age'])
# 取前三行所有列
print(df.loc[:'小兰', :])
'''iloc'''
# 取所有行所有列
print(df.iloc[:, :])
# 取2,3行,第二列
print(df.iloc[1:3, 2:3])
'''布尔索引'''
# 年龄为F的行
print(df.loc[df['gender'] == 'F', :])
# 年龄大于20的行
print(df.loc[df['age'] >= 20, :])
二、DataFrame的行列的增添加和删除及检查
还是用上面的DataFrame
1、添加
# 添加calss列
df.loc[:, 'class'] = [1, 2, 3, 4]
# 添加test1列,全部为1
df.loc[:, 'test1'] = 1
# 添加test2列,数值为test1的两杯
df['test2'] = 2 * df['test1']
print(df)
print('____________')
# 添加一行
df.loc['小周'] = ['M', 15, 87, 5, 1, 3]
print(df)
print('____________')
# 两个DataFrame拼接
df2 = pd.DataFrame([['M', 14, 93, 4, 1, 2]],
columns=['gender', 'age', 'score', 'class', 'test1', 'test2'],
index=['小明', '小张', '小靓', '小蒋'])
df = pd.concat([df2, df], axis=0)
print(df)
2、删除
# 删除重复的行
df = df.drop_duplicates()
print(df)
print('____________')
# 删除缺失的行
df = df.dropna()
# 删除列
df = df.drop(['test1', 'test2'], axis=1)
print(df)
print('____________')
3、检查
# 检查缺失值和填充缺失值
# 检查缺失值
print(df.isnull())
# 填充缺失值
print(df.fillna(0))
三、分组聚合排序
还是用上面的DataFrame
# 以性别分组求平均值
mean = df.groupby('gender').mean()
# 以性别分组年龄的最大值
max = df.groupby('gender')['age'].max()
# 以性别分组,求最低分
min = df.groupby('gender')['score'].min()
# 对各列求和
sum = df.sum()
# 按年龄生序排序
df.sort_values(by='age', ascending=True, inplace=True)
print(df)
四、表的连接
pd.merge
用于数据库风格的合并操作,它可以将两个DataFrame对象按照指定的键(key)或索引合并在一起。这类似于SQL中的JOIN操作
创建Dataframe
# 创建两个示例DataFrame
df1 = pd.DataFrame({
'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]
})
df2 = pd.DataFrame({
'key': ['B', 'D', 'D', 'E'],
'value': [5, 6, 7, 8]
})
连接
# 内连接(inner join),只保留两个DataFrame中都有的键,key
merged_inner = pd.merge(df1, df2, on='key', how='inner')
# 左连接(left join),保留左DataFrame中的所有键
merged_left = pd.merge(df1, df2, on='key', how='left')
# 右连接(right join),保留右DataFrame中的所有键
merged_right = pd.merge(df1, df2, on='key', how='right')
五、对列和行使用自定义函数
pandas
中的 apply
函数是一个非常强大的工具,它允许你对 DataFrame 或 Series 中的单个列或所有列应用一个函数。这个函数可以是 Python 的内置函数,也可以是用户自定义的函数。apply
函数可以在行或列上应用,也可以在 DataFrame 的整个数据上应用。
创建Dataframe
# 创建一个示例 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
自定义函数
# 定义一个自定义函数
def custom_function(x):
if x['A'] + x['B'] > 5:
return 'High'
else:
return 'Low'
操作
# 对 DataFrame 的每个元素应用一个平方函数
squared_df = df.apply(lambda x: x ** 2)
print(squared_df)
# 对 DataFrame 的每一列应用一个函数,计算每个元素的和大于 10 的列
columns_sum = df.apply(lambda col: col.sum() > 10, axis=0)
print(columns_sum)
# 对 DataFrame 的每一行应用一个函数,计算每一行的和
row_sums = df.apply(lambda row: row.sum(), axis=1)
print(row_sums)
print('_____________')
# 对 DataFrame 的每一行应用自定义函数
df['category'] = df.apply(custom_function, axis=1)
print(df)
#
六、python的列表推导式
列表推导式(list comprehension)是 Python 中一种优雅且简洁的构建列表的方法。它允许你通过对一个序列进行操作并筛选出符合条件的元素来创建新的列表。
自定义函数
def fun1(x):
if x > 3:
return 'High'
else:
return 'Low'
常见操作
# 创建一个平方数
squares = [x**2 for x in range(10)]
print(squares)
# 对列表中的每个元素应用一个函数
number = [1,2,3,4,5]
numbers = [fun1(x) for x in number]
print(numbers)
# 过滤列表中的元素(取偶数)
number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers = [x for x in number if x % 2 == 0]
print(numbers)
numbers = [1, 2, 3, 4, 5]
signs = ['+' if x % 2 == 0 else '-' for x in numbers]
print(signs)
# 结果是 ['-', '+', '-', '+', '-']