目录
1、读取文件
2、Series
3、DataFrame
4、pandas查询数据
5、新增数据
6、统计数据
7、数据清洗
使用pandas库首先导入:
import pandas as pd
def pandas_handle_csv():
path = "./tips.csv"
# 读取文件
ratings = pd.read_csv(path)
# 查看前几行数据
print(ratings.head())
# 查看数据的形状,返回(行数、列数)
print(ratings.shape)
# 查看索引列
print(ratings.index)
# 查看每列的数据类型
print(ratings.dtypes)
# 读取txt文本
path2 = './test.txt'
# 指定获取方式
test = pd.read_csv(
path2,
sep=">", # 由该分隔符划分
header=None, # 没有标题行
names=['English', 'text'] # 自定义标题行
)
print(test)
# xlsx格式读取
path3 = "./testData.xlsx"
test2 = pd.read_excel(path3)
print(test2)
# 读取数据库
# 引入数据库
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='root',
database='bloggo',
charset='utf8'
)
mysql_page = pd.read_sql("select * from bloggo_test", con=conn)
print(mysql_page)
def pandas_series():
# Series的使用
s1 = pd.Series([1, 'a', 5.2, 7])
# 左侧为索引,右侧为数据
print(s1)
# 获取索引
print(s1.index)
# 获取数据
print(s1.values)
# 将字典转换成series对象
data = {'name': 'Jack', 'age': 12, 'color': 'red'}
s3 = pd.Series(data)
print(s3)
# 访问series的数据
print(s3['name']) # 返回单个数据
print(type(s3['name'])) # 单独数据的类型
print(s3[['name', 'age']]) # 返回多条数据
print(type(s3[['name', 'age']])) # 返回Series对象类型
def pandas_data_frame():
# dataFrame的属性
data = {
'student': ['Alex', 'Jack', 'Tom', 'John'],
'age': [12, 13, 14, 16],
'hobby': ['basketball', 'soccer', 'football', 'football']
}
df = pd.DataFrame(data) # 转换成dataFrame对象
print(df) # 表格形式的dataFrame对象
print(df.dtypes) # 每个属性对应的类型,以及整体的类型
print(df.columns) # 所有属性的名称
print(df.index) # 数据的条数索引
print(df['student']) # 输出该键名所对应的Series对象的以来数据
print(type(df['student'])) # 类型是Series对象
print(df[['student', 'age']]) # 输出两列数据的dataframe对象
print(type(df[['student', 'age']])) # 返回类型为dataframe对象
print(df.loc[1]) # 输出键值对形式的Series信息
print(type(df.loc[1])) # 类型是Series对象
# 切片输出数据,与基本python切片不同的是序列从1开始,并且左闭右闭
print(df.loc[1:3]) # 输出1,2,3条数据的dataframe对象
print(type(df.loc[1:3])) # dataframe类型
print(df.columns.values) # 获取列名
def pandas_query():
df = pd.read_csv('./planets.csv')
print(df.head()) # 查询前几行数据
# 设定索引为日期,方便按日期查询
df.set_index('year', inplace=True)
print(df.index) # 此时输出所有时间索引以及条数
# # 如果索引不上自己想要的形式可以进行处理
# df.loc[:, 'column1'] = df["column1"] \
# .str.replace('a', "") \
# .astype('int32') # 代替字符 # 改变类型
print(df.loc['2008', 'mass']) # 得到单个值
print(df.loc['2008', ['mass', 'distance']]) # 得到一个Series
print(df.loc[['2008', '2009', '2010'], 'distance']) # 得到Series
print(df.loc[['2008', '2009', '2010'], ['mass', 'distance']]) # 得到dataframe
print(df.loc['2008':'2020', 'mass']) # 行index按区间
print(df.loc['2008', 'mass':'distance']) # 列index按区间
print(df.loc[df['year'] < '2008', :]) # bool查询
# 函数查询
# 直接写lambda表达式
print(df.loc[lambda method: (df['number'] <= 30) & (df['number2'] > 15), :])
# 编写自己的函数查询
def query_my_data(d):
return d.index.str.startswith('2008') & df['number'] > 1
print(df.loc[query_my_data, :])
def pandas_add_new_data():
df = pd.read_csv('./tips.csv')
# 注意,df['number']是一个Series后面减法以后返回的是Series
# 新增方法一 直接操作,最简单的写法
# 执行以后会在原有的基础上新增一个new_column列
df.loc[:, 'new_column'] = df['number1'] - df['number2']
# 新增方法二 apply,通过调用函数来新增,较为常用
def get_number_type(x):
if x['number'] > 5:
return 'small'
else:
return 'big'
# 注意需要设置axis==1,这是series的index是columns
df.loc[:, 'number'] = df.apply(get_number_type, axis=1)
# 查看类型的计数
df['number'].value_counts()
# 新增方法三 assign可以同时添加多个新的列
df.assign(
new_number=lambda x: x['number'] * 9 / 5 + 32,
new_number2=lambda y: y['number'] / 10 % 10 + 32
)
# 新增方法四 按条件选择分组分别赋值
# 先创建空列(这是第一种创建性列的方法)
df['column'] = ""
df.loc[df['column1'] - df['column2'] > 10, 'column'] = '数量差'
df.loc[df['column1'] - df['column2'] <= 10, 'column'] = '数组正常'
df['column'].value_counts() # 统计数量
def pandas_statistics():
df = pd.read_csv('./tips.csv')
# 一、数值型数据
# 一下子提取所有数组列统计结果
# 显示各种计数后的属性,如最大值、最小值等
df.describe()
# 查看单个Series的数据
df['number'].mean()
# 最大值
df['number'].max()
# 最小值
df['number'].min()
# 二、非数字类型的数据
# 对应一些非数字类型的数据采用
# 唯一去重和按值计数
# 唯一去重
df['text'].unique() # 返回全部键名取值的一维数组
# 按值计数
df['text2'].value_counts() # 返回每个对应出现的次数
# 三、相关系数和协方差
'''
1.协方差:衡量同向反向程度,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;
如果协方差为负,说明×,Y反向运动,协方差越小说明反向程度越高。
2.相关系数:衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,
当相关系数为- 1时,说明两个变量变化的反向相似度最大
'''
# 协方差矩阵:
df.cov()
# 相关系数矩阵
df.corr()
# 单独查看数据之间的相关系数
df['number1'].corr(df['number2'])
# 或者
df['number1'].corr(df['number2'] - df['number3'])
# !! 这就是特征工程对于机器学习重要性的一个例子
def pandas_miss_value_handle():
# 第一步
# 越过两个空从第3个开始处理
df = pd.read_excel("./testData.xlsx", skiprows=2)
# 判断是否为空值
# 为空数据的位置会返回True,有数据的位置返回False
df.isnull()
# 为空数据的位置会返回False,有数据的位置返回True
df['number'].notnull()
# 第二步
# 筛选没有空分数的所有行
df = df.loc[df['number'].notnull(), :]
# 第三步
# columns表示按列删除,all表示所有字段都是空值则删,inplace=True表示直接修改可以
df = df.dropna(axis='columns', how='all', inplace=True)
# 第四步
# index表示删除行
df = df.dropna(axis='index', how='all', inplace=True)
# 经过三、四步以后全为空的列和行都被删除了
# 第五步
# 将分数列为空的填充为0分
# 方法一
df = df.fillna({'number': 0})
# 方法二,等同于
df.loc[:, 'number'] = df['number'].fillna(0)
# 第六部
# 将姓名的缺省值填充
# 使用前面的有效值填充,用ffill:forward fill
df.loc[:, 'name'] = df['name'].fillna(method="ffill")
更多详情参考官方文档:API 参考手册 | Pandas 中文