读取文件
# 读取excel文件
df = pd.read_excel("abc.xlsx")
# 读取MySQL数据库
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
user = 'root',
password = '123456',
database = 'test',
charset = 'utf-8'
)
mysql_page = pd.read_sql("select * from 表名", con = conn)
查询行和列
# 查询一列
df[['列名']]
# 查询多列
df[['列名1','列名2']]
# 查询一行 index会变成列名
df.loc[索引号]
# 查询多行
df.loc[索引号1, 索引号2]
查询数据
Pandas查询数据的几种方法:
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置查询
- df.where方法
- df.query方法
# 替换掉温度的后缀
df.loc[:,'bWendu'] = df['bWendu'].str.replace('℃','').astype('int32')
1. 使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配
# 得到单个值
df.loc['2018-01-03','bWendu'] // 2
# 得到一个Series
df.loc['2018-01-03',['bWendu','yWendu']
2. 使用值列表批量查询
# 得到Series
df.loc[['2018-01-03','2018-01-04','2018-01-05'],'bWendu']
# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'],['bWendu','yWendu']]
3. 使用范围区间进行范围查询
注意:区间既包含开始,也包含结束
# 行index按区间
df.loc['2018-01-03':'2018-01-05','bWendu']
# 列index按区间
df.loc['2018-01-03','bWendu':'fengxiang']
# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05','bWendu':'fengxiang']
4. 使用条件表达式查询
# :表示取全部的列
df.loc[df['yWendu']<-10, :]
5. 调用函数查询
# 直接写lambda表达式
df.loc[lambda df : (df['bWendu'] <= 30) & df['yWendu'] >= 15), :]
# 编写自己的函数
def query_my_data(df):
return df.index.str.startwith('2018-09') & df['aqiLevel'] == 1
df.loc[query_my_data, :]
新增数据列
1. 直接赋值
df.loc[:,'wencha'] = df['bWendu'] - df['yWendu']
2. df.apply()方法
def get_wendu_type(x):
if x['bWendu'] > 33:
return "高温"
elif x['bWendu'] < -10:
return "低温"
else:
return "常温"
# 设置axis=1表示索引是DataFrame的列
df.loc[:,'wendu_type'] = df.apply(get_wendu_type, axis=1)
3. 按条件选择分组分别赋值
# 先创建空列
df['wencha_type'] = ''
df.loc[df.['bWendu'] - df.['yWendu'] > 10, 'wencha_type'] = '温差大'
df.loc[df.['bWendu'] - df.['yWendu'] <= 10, 'wencha_type'] = '温差正常'
数据统计函数
1. 汇总类统计
# 查看有关数据集每一列的统计数据,例如count,mean,std,min,max
df.describe()
# 查看某一特定列的最大值
df["列名"].max()
2. 唯一去重和按值计数
# 一般不用于数值列,而是枚举、分类列
df['fengxiang'].unique() # 可以知道有哪些风向
# 按值计数
df['fengxiang'].value_counts() # 可以知道每种风向出现的次数,结果按照降序排列
3. 相关系数和协方差
# 协方差矩阵
df.cov()
# 相关系数矩阵
df.corr()
# 单独查看空气质量和最高温度的相关系数
df['aqi'].corr(df['bWendu'])
# 查看空气质量和温差的相关系数
df['aqi'].corr(df['bWendu']-df['yWendu'])
缺失值处理
Pandas处理缺失值使用的函数:
- isnull和notnull:检测是否为空值,可用于df和series
- dropna:丢弃、删除缺失值,其有3个参数
- axis:删除行还是列(axis = 0或者‘index’则按行删除,axis = 1或者‘columns则按列删除,默认按行删除
- how:如果等于any则任何值为空都删除,如果等于all则所有为空才删除
- inplace:如果为True则修改当前df,否则返回新的df
- fillna:填充空值,其有4个参数
- value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
- method:等于ffill使用前一个不为空的值填充,等于bfill使用后一个不为空的值填充
- axis:按行还是列进行填充
- inplace:如果为True则修改当前df,否则返回新的df
# 删除全是空值的列
df.dropna(axis="columns", how="all", inplace=True)
# 将值为空的列填充为0
df.fillna({"列名":0})
# 等同于
df.loc[:, '列名'] = df['列名'].fillna(0)
# 用前面的有效值填充缺失值
df.loc[:, '列名'] = df['列名'].fillna(method='ffill')
数据排序
Series的排序:
Series.sort_values(ascending=True, inplace=False)
- ascending:默认为True升序排列,为False降序排列
- inplace:是否修改原始Series
DataFrame.sort_values(by,ascending=True, inplace=False)
- by:字符串或者List<字符串>,单列排序或者多列排序
- ascending: boolean或者List,升序还是降序,如果是list对应by 的多列
- inplace:是否修改原始DataFrame
# Series的排序
df['aqi'].sort_values(ascending=False)
# DataFrame的排序
df.sort_values(by='aqi', ascending=False)
# 多列排序
df.sort_values(by=['aqiLevel','bWendu'], ascending=[True, False])
字符串处理
- 使用方法:先获取Series的str属性,然后在属性上调用函数
- 只能在字符串列上使用,不能在数字列上使用
- DataFrame上没有str属性和处理方法
- Series.str并不是Python原生字符串,而是自己的一套方法,不过大部分和原生str很相似
# 判断是不是数字
df['bWendu'].str.isnumberic()
(未完待续~)