dataframe读写数据操作
python
import pandas as pd
# 准备数据(字典)
data = [
[1, '张三', '1999-3-10', 18],
[2, '李四', '2002-3-10', 15],
[3, '王五', '1990-3-10', 33],
[4, '隔壁老王', '1983-3-10', 40]
]
df = pd.DataFrame(data, columns=['id', 'name', 'birthday', 'age'])
df
写到csv文件中 ,路径在当前目录同级的output目录下,不需要索引,不需要标题,列与列的分隔符为'*',只显示id,name,birthday三列,并且为追加模式
python
df.to_csv('./output/student11.csv',
index=False,
header=False,
sep='*',
columns=['id', 'name', 'birthday'],
mode='a')
读取csv文件 将第零列作为索引列,不需要标题,只显示一列,两行数据
python
pd.read_csv('./output/student11.csv',
index_col=0,
header=None,
usecols=[0],
nrows=2)
写到excel文件中 不需要索引 需要标题
python
df.to_excel('./output/student11.xlsx',index=False,header=True)
读excel文件,索引为第零列,标题也是第零行,跳过一行
python
pd.read_excel('./output/student11.xlsx',index_col=0,header=0,skiprows=1)
python
pd.read_excel('./output/student12.xlsx',index_col=0)
将数据写到mysql中 (可能出现中文乱码错误 创建库的时候 加上
create database test character set 'utf8';
)
建立连接 mysql数据库+pymysql子数据库 ://用户名:密码@ip地址:端口号/库名?编码
python
# 连接
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8')
con是上面的连接 如果存在就替换 不需要索引
python
df.to_sql('student', con=engine, if_exists='replace', index=False)
追加
python
from sqlalchemy import types
dtype = {'birthday':types.Date}
df.to_sql('student_2', con=engine, if_exists='append', index=False, dtype=dtype)
从sql中读取数据
python
import pandas as pd
from sqlalchemy import create_engine
# 1 通过表读
conn = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8')
# df = pd.read_sql("student_2", con=conn)
df = pd.read_sql_table("student_2", con=conn)
df
通过从mysql中读取 然后 查询表
python
# sql 读取
import pandas as pd
from sqlalchemy import create_engine
# 1 通过表读
conn = create_engine('mysql+pymysql://root:123456@192.168.88.100:3306/test?charset=utf8')
# df = pd.read_sql("select * from student_2 where age>30", con=conn)
df = pd.read_sql_query("select * from student_2 where age>30", con=conn)
df
获取df子集
加载数据 获取前五行 (tail()获取后五行)
python
import pandas as pd
# 加载数据 ../data/b_LJdata.csv
df = pd.read_csv('./data/b_LJdata.csv').head()
df
获取户型列
法一 :df['户型']
法二 :df.户型
获取多列 (再包一层)
df[['户型','价格']]
获取面积大于80的数据
df['面积']>80
list(df['面积']>80)
[False, False, True, True, False]
法一:df[[False, False, True, True, False]]
或者
法二:df[df['面积']>80]
通过切片获取数据
df[:5:3] 左闭右开 [start:end:step]
案例 : 获取天通苑租房、望京租房、北苑租房 且朝向为东或南的房子信息
最后用new_df再包一下
(new_df['区域']=='天通苑租房') | (new_df['区域']=='望京租房') | (new_df['区域']=='北苑租房') 或者
new_df['区域'].isin(['天通苑租房','望京租房','北苑租房'])
(new_df['朝向']=='东') | (new_df['朝向']=='南')
或者
new_df['朝向'].isin(['东','南'])
((new_df['区域']=='天通苑租房') | (new_df['区域']=='望京租房') | (new_df['区域']=='北苑租房')) & ((new_df['朝向']=='东') | (new_df['朝向']=='南'))
或者
new_df[new_df['区域'].isin(['天通苑租房','望京租房','北苑租房']) & new_df['朝向'].isin(['东','南'])]
python
#法一
new_df[
( (new_df['区域']=='天通苑租房') |
(new_df['区域']=='望京租房') |
(new_df['区域']=='北苑租房') )
&
((new_df['朝向']=='东') |
(new_df['朝向']=='南'))
]
# 法二
new_df[new_df['区域'].isin(['天通苑租房','望京租房','北苑租房'])
& new_df['朝向'].isin(['东','南'])]
df方法
- loc通过行列名获取子集
- iloc通过行列下标获取子集
- query函数获取子集
- isin函数获取子集
加载数据获取前十行
python
import pandas as pd
df = pd.read_csv('./data/b_LJdata.csv')
df
new_df = df.head(10)
new_df
loc通过行列名获取子集
new_df[new_df.index == 2] #获取索引为2这行
new_df.loc[2] #series对象
new_df[new_df.index.isin([2,3,4])]
new_df.loc[[2,3,4]] #注意两个[]
new_df[['区域','地址','价格']] #获取多列
切片
new_df.loc[:6:2] 左闭右闭
区别于
new_df[:6:2] 左闭右开
布尔值向量获取行数据
求面积大于85的房子的区域,户型和价格
new_df.loc[new_df['面积']>85, ['区域', '户型', '价格']]
等价于
new_df[new_df['面积']>85][['区域','户型','价格']]
new_df.loc[[1,3,5]] #根据位置 取第一第三第五行数据
new_df.loc[[1,3,5],['区域', '面积', '价格']]
new_df.loc[:,'区域':'价格':2] 逗号左边表示取几行逗号右边表示要几列
iloc通过行列下标获取子集
行下标获取一行
new_df.iloc[2] 与new_df.loc[2]相同
new_df[new_df.index==2]
获取某个
new_df.iloc[2,1]
'远见名苑'
获取多行数据
new_df.iloc[[2,3]] 同 new_df.loc[[2,3]] 同 new_df[new_df.index.isin([2,4])]
new_df.iloc[1:3:1] 左闭右开
new_df.iloc[:,1:3] 全部行,列从(索引)第一列到第三列 左闭右开 步长为一
new_df.iloc[[2,5,8],[0,2]] 同 new_df.loc[[2, 5, 8], ['区域', '户型']]
或new_df[new_df.index.isin([2,5,8])][['区域','户型']]
isin函数获取子集
new_df.isin(['天通苑租房', '南', 50, 103])
原数据
new_df[new_df.isin(['天通苑租房', '南', 50, 103])] #再套一层
表示两个条件同时成立 满足区域 满足朝向
new_df[new_df['区域'].isin(["天通苑租房", "北苑租房", "望京租房"]) & new_df['朝向'].isin(["南", "东"])]
在上述条件下 求面积
new_df[new_df['区域'].isin(["天通苑租房", "北苑租房", "望京租房"]) & new_df['朝向'].isin(["南", "东"])]['面积']
或
new_df['面积'][new_df['区域'].isin(["天通苑租房", "北苑租房", "望京租房"]) & new_df['朝向'].isin(["南", "东"])]
query函数获取子集
new_df.query('区域 in ("天通苑租房", "北苑租房", "望京租房") and 朝向 in ("南", "东")')
- 目标: 查询 区域是 北苑租房
new_df[new_df['区域']== '北苑租房'] new_df.loc[new_df['区域']== '北苑租房'] new_df.iloc[new_df.index[new_df['区域']=='北苑租房']] new_df.query('区域=="北苑租房"')
- 目标: 查询 区域是 天通苑租房 北苑租房 小西天租房; 朝向是 南 东南
new_df[(new_df['区域'].isin(['天通苑租房', '北苑租房', '小西天租房'])) & (new_df['朝向'].isin(['南', '东南']))]
new_df.query('区域 in ("天通苑租房", "北苑租房", "小西天租房") and 朝向 in ("南", "东南")')
- 目标: 查询 区域是 天通苑租房 北苑租房 小西天租房; 朝向是 南 东南 对应 价格
new_df.query('区域 in ("天通苑租房", "北苑租房", "小西天租房") and 朝向 in ("南", "东南")')['价格']
new_df['价格'].to_frame()[(new_df['区域'].isin(['天通苑租房', '北苑租房', '小西天租房'])) & (new_df['朝向'].isin(['南', '东南']))]