Pandas基础使用1-10

Pandas基础使用1-10

1 读取数据

  1. pandas读取纯文本文件

    • 读取csv文件

    • 读取txt文件

  2. pandas读取xlsx格式excel文件

  3. pandas读取mysql数据表S

import pandas as pd

fpath = './data.csv'

ratings = pd.read_csv(fpath, sep='\t', header=None, names=['pdata', 'pv', 'uv'])

# 查看前5行数据
ratings.head()

# 查看数据形状
ratings.shape

# 查看列名
ratings.columns

# 查看索引
ratings.index

# 查看每列数据的格式
ratings.dtypes

2 Pandas数据结构

  1. Series
  2. DataFrame
  3. 从DataFrame中查询出Series
import pandas as pd
import numpy as np

# Series
# 使用python列表创建Series
s1 = pd.Series([1, 'a', 5.2 ,7], index=['d','b','a','c'])	# 索引可以不指定,默认数字排序
s1.index	# 获取索引
s1.values	# 获取数据,返回一个np.array

# 使用篇python字典创建Series
sdata={'Ohio':35000,'Texas':72000,'Oregon':16000,'Utah':5000}
s2 = pd.Series(sdata)

# 根据数据索引查询数据
s1['a','b']

# DataFrame
# 根据多个字典序列创建dataframe
data={
        'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]
    }
df = pd.DataFrame(data)

# 查看columns和index
df.columns
df.index

# 从DataFrame中查询Series
df['year', 'pop']
# 查看数据类型
type(df['year'])

# 查询一行,结果是一个pd.Series
df.loc[1]
type(df.loc[1])
# 查询多行
df.loc[1:3]

3 Pandas查询数据

  • Pandas查询数据的几种方法
    1. df.loc方法,根据行、列的标签值查询
    2. df.iloc方法,根据行、列的数字位置查
    3. df.where方法
    4. df.query方法

.loc既能查询,又能覆盖写入,强烈推荐!

  • Pandas使用df.loc查询数据的方法
    1. 使用单个label值查询数据
    2. 使用值列表批量查询
    3. 使用数值区间进行范围查询
    4. 使用条件表达式查询
    5. 调用函数查询

注意

  • 以上查询方法,既适用于行,也适用于列
  • 注意观察降维dataFrame>Series>值
import pandas as pd
print(pd.__version__)

# 读取数据
df = pd.read_csv('./datas/beijing_tianqi/beijing_tianqi_2018.cav')
df.head()

# 设置索引为日期,方便按日期进行筛选
df.set_index('ymd', inplace=True)
df.index
df.head()

# 替换掉温度的后缀℃
df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')

# 使用单个label值查询数据
df.loc['2018-01-03', ['bWendu', 'yWendu']]

# 使用列表批量查询
# 得到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']]

# 使用数值区间进行范围查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']

# 使用条件表达式查询,查询温度小于-10的日期
df.loc[df['yWendu']<-10,:]
# 复杂查询,查一下完美天气
# 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df['bWendu']<=30) & (df['tianqi']=='晴') & (df['aqiLevel']==1), :]

# 调用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, :]

4 pandas怎样新增数据列

  1. 直接赋值
  2. df.apply方法
  3. df.assign方法
  4. 按条件选择分组分别赋值
import pandas as pd

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)

# 直接复制法,得到温差
df.loc[:, 'wencha'] = df['bWendu'] - df['yWendu']

# df.apply方法,添加一列,如果温度大于33度就设为高温,低于-10就是低温,否则是常温
def get_wendu_type(df):
    if df['bwendu']>33:
        return '高温'
    elif df['yWendu']<-10:
        return '低温'
    elsereturn '常温'
df.loc[:, 'wendu_type'] = df.apply(get_wendu_type, axis=1)
df.head()

# df.assign方法,实现将摄氏度转化为华氏度
df.assign(
    yWendu_huashidu = lambda x:x['yWendu'] * 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"] = "温差正常"
# 计数
df['wencha_type'].value_counts()

5 Pandas数据统计函数

# 一下提取所有数字列的统计结果
df.describe()

# 查看单个Series的数据
df["bWendu"].mean()
df["fengxiang"].unique()
df["fengxiang"].value_counts()

# 相关系数和协方差
df.cov()	# 协方差矩阵
df.corr()	# 相关系数矩阵
# 单独查看两个Series的相关系数
df["aqi"].corr(df["yWendu"])
df["aqi"].corr(df["bWendu"]-df["yWendu"])

6 缺失值处理

Pandas使用这些函数处理缺失值:

  • isnull和notnull:检测是否是空值,可用于df和series
  • dropna:丢弃、删除缺失值
    • axis : 删除行还是列,{0 or ‘index’, 1 or ‘columns’}, default 0
    • how : 如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
    • inplace : 如果为True则修改当前df,否则返回新的df
  • fillna:填充空值
    • value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
    • method : 等于ffill使用前一个不为空的值填充forword fill;等于bfill使用后一个不为空的值填充backword fill
    • axis : 按行还是列填充,{0 or ‘index’, 1 or ‘columns’}
    • inplace : 如果为True则修改当前df,否则返回新的df
import pandas as pd

df = pd.read_excel("./datas/student_excel/student_excel.xlsx", skiprows=2) # 跳过前两行

# 检测空值,返回布尔值
df.isnull()
df['分数'].isnull()
df['分数'].notnull()

# 筛选没有空数的行
df.loc[df['分数'].notnull(), :]

# 删除全为空值的列
df.dropna(axis='columns', how='all', inplace=True)

# 删除全为空值的行
studf.dropna(axis="index", how='all', inplace=True)

# 将分行列为空的值填充为0,一下两种方法等价
df.fillna({'分数'0})
df.loc[:,'分数'] = df['分数'].fillna(0)

# 使用前面的有效值填充
df.loc[:,'姓名'] = df['姓名'].fillna(method='ffill')

# 保存清理好的数据
df.to_excel('./data/student_excel.xlsx', index = False)

7 数据排序

Series的排序:
Series.sort_values(ascending=True, inplace=False)
参数说明:

  • ascending:默认为True升序排序,为False降序排序
  • inplace:是否修改原始Series

DataFrame的排序:
DataFrame.sort_values(by, ascending=True, inplace=False)
参数说明:

  • by:字符串或者List<字符串>,单列排序或者多列排序
  • ascending:bool或者List,升序还是降序,如果是list对应by的多列
  • inplace:是否修改原始DataFrame
import pandas as pd

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)

# Series排序
df['aqi'].sort_values(ascending=False, inplace=Ture)

# DataFrame排序
df.sort_values(by ='aqi', ascending=False)
# 多列排序
df.sort_values(by=['aqi', 'bWendu'], ascending=[True, False])

8 字符串处理

df["bWendu"].str

# 字符串替换函数
df["bWendu"].str.replace("℃", "")

# 判断是不是数字
df["bWendu"].str.isnumeric()

# 使用str的startwith、contains等得到bool的Series可以做条件查询
condition = df['ymd'].str.startwith('2018-03')
df[conditon].head()

# 将日期进行筛选并输出前六位
df['ymd'].str.replace('-', '').str.slice[0,6]

# 使用正则表达式的处理
def get_nianyueri(x):
    year,mouth,day = x['ymd'].split('-')
    return f'{year}{mouth}{day}日’
df['中文日期'] = df.apply(get_nianyueri, axis=1)

# 将中文日期中年月日三个中文字符去除
# 链式replace
df['中文日期'].str.replace('年''').str.replace('月''').str.replace('日', '')
# 正则表达式
df['中文日期'].str.replace('[年月日]''')	# 推荐使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值