赞
踩
import pandas as pd df = pd.read_csv('data/LJdata.csv') # 两种写法都可以获取数据中的一列 df['区域'] # 推荐这种写法 返回Series 获取的Series 会有一个name属性, 这个属性中会保存的是df的列名信息 df.区域 # 当列名比较特殊的时候, 和一些方法、属性的名字冲突, 得到的结果会想的不一样, 不会返回这一列数据
获取多列, [列名的列表]
df[['区域','价格']] # 如果列表里只有一个元素, 返回的也是一个dataframe
loc 是属性 后面接[] 来获取df中的部分数据
loc[] []传入的是 行, 列名字, 不是编号
df.loc[0] df.[ 行名处理, 列名处理] df.loc[[2,4,6],['区域','价格']]
loc 支持切片, loc切片操作两边都是闭区间
df.loc[:3,:'朝向']
行名 3之前,包含3, 列名在朝向之前, 包含朝向, 返回对应的数据
iloc 是属性 后面接[] 来获取df中的部分数据
iloc [] []传入的是 行, 列编号, 不是名字
df.iloc[0,0] # 获取的是第0行,第0列 格里的数据 df.iloc[:2,:3] # iloc 切片 左闭右开 df.iloc[[0,1,2],[1,2,3]] # 获取第0,1,2行, 第1,2,3列数据
类似于SQL的where 条件 , 传入的条件是一个字符串
- 区域是望京租房的数据查询出来 df[df['区域']=='望京租房'].head() df.loc[df['区域']=='望京租房'].head() df.query('区域=="望京租房"').head()
query函数, 传入条件字符串, 条件中又包含了字符串,需要注意字符串 引号闭合的顺序
使用query传入多个条件
df.query('区域 in ["望京租房","回龙观租房"] and 朝向 in ["东","南"]')
多个条件在一起拼的时候要是用and or 而不是 & |
通过 df.isin(values=[值1, 值2, ...])
判断df中的数据值是否在values列表值中, 返回由布尔值构成的新df
原df中数据值在values列表中返回True, 否则返回False
区域是望京租房的数据查询出来
df['区域'].isin(['望京租房','回龙观租房']) # 多个isin 用 & | 来拼接 df[(df['区域'].isin(['望京租房','回龙观租房'])) & (df['朝向'].isin(['西南 东北','南 北'])) ]
两种方法
df['新列名'] = ’新值‘ df['新列名'] = series_新值
df.insert(loc = 插入的位置编号 ,column ='新列名' ,value = 要插入的值)
区别,insert可以指定插入的位置编号, df['新列名'] = ’新值‘ 插入的新列在df的最后
import pandas as pd df = pd.read_csv('data/LJdata.csv') df_head = df.head() # 取出前五条并保存 df_head['省份']='北京' # 每一行都会赋值为 北京 df_head['区县'] = ['朝阳区','朝阳区','西城区','昌平区','朝阳区'] # 传入列表长度和df长度必须一致
insert
df.insert(loc=,column=,value=) - loc 插入的列的序号 - column 插入列的列名 - value 插入这一列具体的取值 df_head2.insert(0,column='省份',value='北京')
需要注意, insert 是我们课程中涉及到的唯一一个修改数据, 直接在原始数据上修改的api
其它修改数据的api 比如排序, 去重, 等都会有一个inplace参数 默认是False 默认会复制一份数据,在副本上修改, 这个insert不会
drop方法 默认是按行删除
axis 很多操作数据的方法, 既可以按行,也可以按列,比如删除, 比如 求和 求平均, 这一列方法都会有一个参数 axis 默认值是0 可选值是0,1
inplace = 默认False 改成True会在原来的数据上进行删除
df_head.drop('省份',axis=1,inplace=True)
df_head3.drop_duplicates(subset=['户型','朝向']) df_head3.drop_duplicates(subset=['户型','朝向'],keep='last',inplace=True) df_head3.drop_duplicates(subset=['户型','朝向'],keep='last',ignore_index=True)
subset 传入列名的列表, 用来做重复判断的条件
keep = 默认是first 满足重复条件的数据, 保留第一次出现的, 还可以选last 保留最后一次出现的
ignore_index = 默认是False 去重后会保留原来的索引, 改成True之后, 会重新给从0开始的索引
inplace
如果只修改一个, 或者一列值整体替换, 可以用直接修改的方式
df.loc[0,’朝向‘] = ’东 北‘ 直接找到位置修改 df_head3['价格'] = [4800,5800,6800,7800,8800]
如果要批量替换某个值, 可以用replace方法
df_head3.replace(to_replace='东',value='北')
to_replace = 要被修改的值
value = 修改后的值
注意 to_replace 在dataframe中如果不存在, 代码不会报错, 什么都不会发生
inplace
apply 使用的场景, 修改的逻辑相对复杂, 使用自带的API不能满足需求
def func(x): print(x) if x=='天通苑租房': return '昌平区' else: return x # 遍历 区域这一列, 每遍历一条数据就会调用一次 func 把每个值传递给func函数 func函数的返回值 作为 apply的结果, 返回的还是Series s = df_head3['区域'].apply(func)
apply 可以传递出了 series值其它参数, 但是传参必须从第二个参数开始
df_head3 = df.head().copy() def func(x,arg1,arg2): print(x) if x=='天通苑租房': return arg1 else: return arg2 df_head3['区域'].apply(func,args=['昌平区','其它区'])
df.apply(func , axis = 默认值0)
默认会传入每一列的series 对象, 如果数据有5列, func就会被调用5次 ,每次传入一列series对象
axis = 1 会传入每一行的Series对象, 如果数据有10行, func就会被调用10次, 每次传入一行的series对象
def func1(x): return x['价格']/x['面积'] df_head3 = df.head().copy() df_head3.apply(func1,axis=1)
df.apply() 传入自定义函数的时候,函数也可以接受额外的参数
def func2(x,arg1): # print(x) if x['区域']=='天通苑租房': x['价格'] = x['价格']+arg1 return x df_head3.apply(func2,axis=1,args=[2000])
传参 args 一定是列表
applymap 会遍历每一个格的数据, 一个一个数据取出来, 交给自定义函数处理
def func3(x): if x=='2室1厅': return '3室1厅' else: return x df_head3.applymap(func3)
遍历df中所有的数据, 如果值是'2室1厅'修改成3室一厅
行索引 s.index df.index
列名(列索引) df.columns
要修改行、列名字,可以直接修改
s.index = [] df.index = []
df.columns = []
s.index[0] = 新值 这种修改方式不支持
修改行列名字的API 三个方法 , 都有Inplace参数
df.set_index(列名) 可以设置一列, 作为新的行索引
df.reset_index() 重置索引, 设置成从0开始的整数编号索引, 原来的索引会变成一列数据
df.rename()
可以修改指定取值的行索引, 列名
df.rename(index = {'老值':'新值'},columns={'老值':'新值'})
注意 rename和之前replace类似, 如果老值没有找到, 不会报错, 代码正常运行,只不过什么都不会发生
导包创建连接
from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://root:root12345@localhost:3306/test1?charset=utf8')
'mysql+pymysql://用户名:密码@mysql服务IP地址:3306/数据库名字?charset=utf8'
写入数据到Mysql
student.to_sql('student', con=engine, if_exists='append', index=False)
从Mysql读取数据
pd.read_sql(sql='student', con=engine.connect(),columns=['id','name','age'])
讲义上写的是engine, 这里由于版本的问题, 需要使用engine.connect()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。