Pandas as pd基础知识一

使用模块
import pandas as pd
使用pandas读取csv文件
csv_path = r'D:\Code\Other\ant-learn-pandas\datas\ml-latest-small\ratings.csv'
df = pd.read_csv(csv_path)
print(df.head())  # 查看多少行,默认5行
print(df.shape)    # 显示行数、列数
print(df.columns)  # 查看列名
print(df.index)    # 查看索引列
print(df.dtypes)    # 查看每列的数据类型
使用pandas读取txt文件
txt_path = r'D:\Code\Other\ant-learn-pandas\datas\crazyant\access_pvuv.txt'
# 参数:1:文件路径,2:列的分隔符,3:没有标题行,所以是None,4:自定义列名
df = pd.read_csv(txt_path, sep='\t', header=None, names=['pdate', 'pv', 'uv'])
print(df)    # 读取内容
使用pandas读取Excel文件
excel_path = r'D:\Code\Other\ant-learn-pandas\datas\crazyant\access_pvuv.xlsx'
df = pd.read_excel(excel_path, names=['date', 'num1', 'num2'])
print(df)  # 读取内容
print(df.head())    # 查看多少行,默认5行
print(df['date'][1])   # 获取日期中索引为1的数据
print(df['num1'][[1, 2]])   # 获取多个索引的数据
print(type(df['date'][1]))   # 查询日期中下标为1的数据类型
print(df.dtypes)
使用pandas读取mysql表
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user=USERNAME, password=PASSWORD, database=DATABASENAME, charset='utf8')
df = pd.read_sql("select * from company", con=conn)
print(df)
使用pandas中创建Series:方法一
s1 = pd.Series([1, 'a', 5.2, 7])   # 构建一个一维数组
print(s1)   # 结果为列显示,第一列:索引,第二列:元素
print(s1.index)     # 获取索引
print(s1.values)    # 获取数据
使用pandas中创建Series:方法二
# 创建一个具有索引标签的Series
s2 = pd.Series([1, 'a', 5.2, 7], index=['a', 'b', 'c', 'd'])
print(s2)     # 输出结果
print(s2.index)   # 查看Series的索引
print(s2['a'])  # 根据索引查找值
print(type(s2['c']))    # 查看值的数据类型
print(s2[['b', 'd']])   # 获取多个索引的值
print(type(s2[['b', 'd']]))   # 获取多个值的数据类型
使用pandas中创建Series:方法三
# 通过字典创建Series
sdata = {'Ohio': 35000, 'Teaxs': 72000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)   # 字典的key会变成索引,value会变成值
print(s3)
使用pandas中创建DataFrame
data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2003, 2004],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
}
df = pd.DataFrame(data)
print(df)      # 输出结果
print(df.dtypes)     # 查看类型
print(df.index)      # 查看行索引
print(df.columns)    # 查看列的标题
print(df['year'])           # 查询一列
print(type(df['year']))     # 查询一列返回的类型   <class 'pandas.core.series.Series'>
print(df[['year', 'pop']])  # 查询多列
print(type(df[['year', 'pop']]))    # 查询多列返回的类型 <class 'pandas.core.frame.DataFrame'>
print(df.loc[-1:])    # 查询一行
print(df.tail(1))      # 查询最后一行
print(df[-1:])      # 查询最后一行
print(type(df.loc[1]))  # 查询一行返回的类型 <class 'pandas.core.series.Series'>
print(df.loc[1:2])   # 查询多行
print(type(df.loc[[1, 2]]))     # 查询多行返回的类型 <class 'pandas.core.frame.DataFrame'>
使用pandas中的五种查询方式
tianqi_path = r'D:\Code\Other\ant-learn-pandas\datas\beijing_tianqi\beijing_tianqi_2018.csv'
df = pd.read_csv(tianqi_path)
print(tianqi.head())  # 读取前几行数据
df.set_index('ymd', inplace=True)   # 设定索引为日期   inplace=True是直接改变此DataFrame
print(df.index)       # 查看索引
df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')     # 将Wendu中所有列的数据中℃去掉,并转换成int类型数据
df.loc[:, 'yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')     # 将Wendu中所有列的数据中℃去掉,并转换成int类型数据
print(df.head())    # 查询索引被修改后的数据

"""================一:使用单个label值查询数据======================="""
print(df.loc['2018-01-03', 'bWendu'])   # 得到单个值
print(df.loc['2018-01-03', ['bWendu', 'yWendu']])   # 得到一个Series

"""================二:使用值列表批量查询======================="""
print(df.loc[['2018-01-03', '2018-01-04', '2018-01-05'], 'bWendu'])       # 得到Series
print(df.loc[['2018-01-03', '2018-01-04', '2018-01-05'], ['bWendu', 'yWendu']])     # 得到DataFrame

"""================三:使用数值区间进行范围查找======================="""
print(df.loc['2018-01-03':'2018-01-05', 'bWendu'])      # 按照行index区间查询,得到一个Series
print(df.loc['2018-01-03', 'bWendu':'yWendu'])      # 按照列index区间查询,得到一个Series
print(df.loc['2018-01-03':'2018-01-05', 'bWendu':'yWendu'])     # 行与列都按照区间查询,得到一个DataFrame

"""================四:使用条件表达式查询======================="""
# 参数:1:查询所有最低温度小于-10的数据,2:列取了全部;tianqi['yWendu'] < -10条件只会返回结果为True的数据
print(df.loc[tianqi['yWendu'] < -10, :])
# 查询最高温度小于等于30,最低温度大于等于15,是晴天,天气为优的所有数据
if_ = (df['bWendu'] <= 30) & (df['yWendu'] >= 15) & (df['tianqi'] == '晴') & (df['aqiLevel'] == 1)
print(df.loc[if_, :])

"""================五:调用函数查询======================="""
# 使用匿名函数
print(df.loc[lambda df:(df['bWendu'] <= 30) & (df['yWendu'] >= 15), :])
# 编写自己的函数,查询9月份,空气质量为优的数据
def query_my_data(df):
    # 将索引转换成str,并查询日期以2019-09开头的所有日期,及天气为优的数据
    return df.index.str.startswith('2018-09') & df['aqiLevel'] == 1
print(df.loc[query_my_data(tianqi), :])
使用pandas中的四种赋值方法
tianqi_path = r'D:\Code\Other\ant-learn-pandas\datas\beijing_tianqi\beijing_tianqi_2018.csv'
df = pd.read_csv(tianqi_path)
print(df.head())  # 读取前几行数据
df.set_index('ymd', inplace=True)   # 设定索引为日期   inplace=True是直接改变此DataFrame
print(df.index)       # 查看索引

"""================一:直接赋值======================="""
# 将Wendu中所有列的数据中℃去掉,并转换成int类型数据
df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')
# 将Wendu中所有列的数据中℃去掉,并转换成int类型数据
df.loc[:, 'yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')
# 新增列。计算温差
df.loc[:, 'wencha'] = df['bWendu'] - df['yWendu']
# or
df['wencha'] = df['bWendu'] - df['yWendu']
print(df.head())  # 读取前几行数据
"""================二:df.apply方法======================="""
def get_wen_type(x):
    if x['bWendu'] > 33:
        return'高温'
    elif x['yWendu'] < -10:
        return '低温'
    else:
        return '常温'
df['wentype'] = df.apply(get_wen_type, axis=1)      # 使用apply赋值,axis=1则使用的列的索引,axis=0,则使用的行的索引
print(df.head())
print(df['wentype'].value_counts())     # 获取查询到的值出现的次数

"""================三:df.assign方法======================="""
# 将温度改为华氏度,使用assign方法不会改变原有dataframe,会生成一个新的dataframe
print(df.assign(
    yWendu_huashi = lambda x : x['yWendu'] * 9 / 5 + 32,
    bWendu_huashi = lambda x : x['bWendu'] * 9 / 5 + 32
))
"""================四:按条件选择分组分别赋值======================="""
# 高低温差大于10度,则认为温差大
df['wencha_type'] = ''
df.loc[df['bWendu'] - df['yWendu'] > 10, 'wencha_type'] = '温差大'
df.loc[df['bWendu'] - df['yWendu'] <= 10, 'wencha_type'] = '温度正大'
print(df.head())
print(df['wencha_type'].value_counts())
pandas的数据统计函数
tianqi_path = r'D:\Code\Other\ant-learn-pandas\datas\beijing_tianqi\beijing_tianqi_2018.csv'
df = pd.read_csv(tianqi_path)
df['bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')
df['yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')
print(df.head())

"""================一:汇总类统计======================="""
# count:总条数,mean:平均值,min:最小值,max:最大值
print(df.describe())    # 可以看到总体统计
# 查看单个统计
print(df['bWendu'].mean())  # 查看平均数
print(df['bWendu'].min())   # 查询最小值
print(df['bWendu'].max())   # 查询最大值

"""================二:唯一去重和按值计数======================="""
# 唯一去重
print(df['fengxiang'].unique())   # 风向去除重复值
print(df['tianqi'].unique())      # 天气去除重复值
print(df['fengli'].unique())        # 风力去除重复值

# 按值计数
print(df['fengxiang'].value_counts())   # 不同风向出现多少次
print(df['tianqi'].value_counts())      # 不同天气出现多少次
print(df['fengli'].value_counts())        # 不同风力出现多少次

"""================三:相关系数与协方差======================="""
'''
用途:1、两只股票是不是同涨同跌,程度多大,正相关还是负相关;2、产品向量的波动,跟那些因素正相关,负相关,程度有多大
1、协方差:衡量同向反向程度,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高,如果协方差为负,说明X,Y反向运动,协方差越小,说明
    反向程度越高
2、相关系数:衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,当相关系数为-1时,说明两个变量变化的反向相似度最大
'''
print(df.cov())     # 协方差矩阵
print(df.corr())    # 相关系数矩阵
print(df['aqi'].corr(df['bWendu']))     # 单独查看空气质量和最高温的相关系数
print(df['aqi'].corr(df['yWendu']))     # 单独查看空气质量和最低温的相关系数
print(df['aqi'].corr(df['bWendu'] - df['yWendu']))      # 空气质量和温差的相关系数
pandas对缺失值的处理
'''
Pandas使用这些函数处理缺失值:
    1、isnull和notnull:检测是否是空值,可用于df和Series
    2、dropna:丢弃,删除缺失值
        1、axis:删除行还是列,{0 or 'index', 1 or 'columns'}, default 0
        2、how:如果等于any,则任何值为空都删除,如果等于all,则所有数值都为空才删除
        3、inplace:如果为True,则修改当前df,否则返回新的df
    3、fillna:填充空值
        1、value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
        2、method:等于ffill使用前一个不为空的值填充forword fill;等于bfill使用后一个不为空的值填充backword fill
        3、axis:按行还是按列填充,{0 or 'index', 1 or 'columns'}
        4、inplace:如果为True,则修改当前df,否则返回新的df
'''
student_path = r'D:\Code\Other\ant-learn-pandas\datas\student_excel\student_excel.xlsx'
df = pd.read_excel(student_path, skiprows=2)    # skiprows参数忽略前几个空行
print(df)
print(df.isnull())      # 如果是空值,则为True,反之False
print(df.notnull())     # 如果是空值就返回False,反之返回True
print(df['分数'].isnull())    # 可以查询单列
print(df.loc[df['分数'].notnull(), :])    # 帅选出分数列没有空值的所有数据
df.dropna(axis='columns', how='all', inplace=True)     # 删除全是空值的列
df.dropna(axis='index', how='all', inplace=True)    # 删除全是空值的行
# df.fillna({"分数": 0}, inplace=True)        # 将分数为空值的赋值为0
# or
df['分数'] = df['分数'].fillna(0)       # 将分数为空值的赋值为0
# df.fillna(axis='index', method='ffill', inplace=True)   # 将姓名为空的填充为上一个不为空的值
# or
df['姓名'] = df['姓名'].fillna(method='ffill')      # 将姓名为空的填充为上一个不为空的值
df.to_excel(r'D:\Code\Other\ant-learn-pandas\datas\student_excel\student.xlsx', index=False)
print(df)
pandas的SwttingWithCopyWarning报警
'''
总之,pandas不允许先帅选子DataFrame,再进行修改写入
要么使用.loc实现一个步骤直接修改源DataFrame
要么先复制一个子DataFrame再一个步骤执行修改
'''
df_path = r'D:\Code\Other\ant-learn-pandas\datas\beijing_tianqi\beijing_tianqi_2018.csv'
df = pd.read_csv(df_path)
df['bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')
df['yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')
condition = df['ymd'].str.startswith('2018-03')
df[condition]['wencha'] = df['bWendu'] - df['yWendu']   # 抛出异常,pandas无法辨识是view还是copy
print(df[condition].head())

"""================解决方法一======================="""
# 将get与set一步完成
df.loc[condition, 'wendcha'] = df['bWendu'] - df['yWendu']
print(df[condition].head())

"""================解决方法二======================="""
new_df = df[condition].copy()   # 将帅选出来的数据复制一份
new_df['wencha'] = new_df['bWendu'] - new_df['yWendu']  # 在新的df中添加温差
print(new_df)
pandas对数据进行排序
'''
Series的排序:
    series.sort_values(ascending=True, inplace=Flase)
    参数说明:
        1、ascending:默认为True升序排序,为False降序排序
        2、inplace:是否修改原始series
DataFrame的排序:
    DataFrame.sort_values(by, ascending=True, inplace=False)
    参数说明:
        1、by:字符串或者List<字符串>,单列排序或者多列排序
        2、ascending:默认为True升序排序,为False降序排序
        3、inplace:是否修改原始series
'''
df_path = r'D:\Code\Other\ant-learn-pandas\datas\beijing_tianqi\beijing_tianqi_2018.csv'
df = pd.read_csv(df_path)
df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')
df.loc[:, 'yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')

"""================对Series排序======================="""
print(df['aqi'].sort_values(ascending=False))   # 对Series进行降序排序
print(df.loc[:, 'aqi'].sort_values())   # 对Series进行降序排序
print(df['tianqi'].sort_values())       # 对中文排序

"""================对DataFrame排序======================="""
print(df.sort_values(by='bWendu', ascending=False))       # 单列进行降序排序
print(df.sort_values(by=['aqiLevel', 'bWendu'], ascending=False))     # 多列进行降序排序
print(df.sort_values(by=['aqiLevel', 'bWendu'], ascending=[True, False]))   # 多列分别进行升序及降序排序
  • 10
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tian丶Yuting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值