重生归来,我要成功 Python 高手--day25 pandas文件读取与存储,DataFrame数据的操作
文件读取和存储
读取:
read_csv("路径",usecols=[读取指定的列])
存储:不包含之前的索引,使用全新的索引列
df.to_csv(“路径”,index=False)
与MySQL进行交互
导包:
from sqlalchemy import create_engine
读取文件:把读取到的第一列数据当索引
df=pd.read_csv('data/csv示例文件.csv',sep=',',encoding='gbk',index_col=0)
df
创建mysql引擎:连接时必须保证当前数据库包含这个库
root:root登录的用户和密码
localhost:3307:使用本机的mysql使用3307端口
test:使用的数据库
engine = create_engine('mysql+pymysql://root:root@localhost:3307/test?charset=utf8')
写入数据
my_table:表名
engine:使用的引擎
if_exists='append':如果存在追加
index=False:不把索引加入到里面
df.to_sql('my_table',engine,if_exists='append',index=False)
DataFrame数据操作
新增
# 固定值新增
df1['c1']=23
#传入值列表新增
df1['c2']=['a','b','c','d','e']
#通过已有的列进行算术运算
df1['c3']=df1.year*2
#通过函数进行
def my_func():
return 25000
df1['c4']=my_func()
df1
新增多列:assign()这个函数不会影响原有的数据
df2.assign(
c1=23,
c2=['a','b','c','d','e'],
c3=df2.year*2,
c4=my_func()
)
删除
drop():inplace这个参数是对原内容进行修改
用索引的方式删除行,用列名的方式删除列
df4.drop(index=[0,2,4],inplace=True)
df4.drop(columns=['year','GDP'],inplace=True)
del:
使用关键字的形式删除列
del df4['year']
去重
drop_duplicates()函数可以对df和Series对象进行去重
df6.drop_duplicates(inplace=True)
对一个Series进行去重
df6.country.drop_duplicates()
unique:只能对Series和numpy数组进行去重
修改
df[“列名”]=[与列名数量对应的值]
df7['GDP']=[1,2,3,4,5]
替换:第一个参数为被替换的内容,第二个参数是替换的内容
df7.country.replace('日本','jp',inplace=True)
查询数据
1.前
df.head()
2.后
df.tail()
如果为负数:他会展示除了这个几个数的其他内容
3.查询多条数据
df["列1"]=df.列1
df[["列1","列2"]]
4.通过索引获取行数据
df[start:stop:step] == df[起始行下标:结束行下标:步长]遵循顾头不顾尾原则(包含起始行,不包含结束行),步长默认为1
df[:5]前五行也就是0-4行
df[1:5:2]:也就是1和3行
5,查询函数获取子集
df.query(判断表达式)
df.query('country in ["中国","美国","日本"] and (year>=2015 and year<=2019)')
排序
sort_values函数: 按照指定的一列或多列的值进行排序
df.sort_values(['year','GDP'],ascending=[False,True])
sort_index函数:按照行号进行排序
df.sort_index(ascending=False)
rank函数
df.列.rank(method='方法',ascending=False) 默认值为True升序 False为降序
df7 = pd.DataFrame({
'姓名':['小明', '小美', '小强', '小兰'],
'成绩':[100, 90, 90, 80]
})
df7.rank() # 等价于df7.rank(method='average', ascending=True)
df7['成绩排名'] = df7.成绩.rank(method='min', ascending=False)
df7
df7['成绩排名'] = df7.成绩.rank(method='max', ascending=False)
df7
df7['成绩排名'] = df7.成绩.rank(method='dense', ascending=False)
df7
聚合函数
使用 df['列名'].函数名()
常用聚合函数有:
-
min 最小值
df2.min()
df2['year'].min()
-
max 最大值
df2.max()
df2['year'].max()
-
mean 平均值
df2.mean()
df2['year'].mean()
df2['GDP'].mean()
-
sum 求和
-
count 求个数
缺失值处理
判断是否含有缺失值:
df.isnull() 为空 True 不为空为False
df.notnull() 为空 False 不为空为True
删除缺失值:
df.dropna()
处理不是缺失值但是有默认标记
不是缺失值:
先进行替换再删除
df.replace("默认值",np.nan)
之后再删除
填充数据
fillna()
for col_name in df.columns:
if df[col_name].isnull().sum()>0:
df[col_name].fillna(df[col_name].mean(),inplace=True)
- 遍历 DataFrame 的每一列(
for col_name in df.columns) - 检查该列是否存在缺失值(
df[col_name].isnull().sum() > 0) - 如果存在缺失值,则用该列的平均值填充这些缺失值(
df[col_name].fillna(df[col_name].mean(), inplace=True))
数据合并
pd.concat(),ignore_index=True 忽略原索引,重新设置新的索引
join参数,合并的格式默认为满外连接 outer
inner为交集
pd.concat([data1, data2], axis=1)
axis=0:垂直合并,上下
axis=1:水平合并,左右
new1_df=pd.concat([df1,df2],axis=0) new1_df
pd.concat([df1,df2],axis=1)# 按列进行拼接,相同的是行索引号
pd.merge()
参数:左表,右表,how=''连接方式,on=[指定共同的键]
默认为内连接,连接方式:左连接,右连接,内连接,全连接
suffixes参数:如果有相同的列suffixes("","_mean")给第一个不变,第二个加后缀
其他写法:df1.merge(df2.how='inner',on='key1')
df1=pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
df1
df2=pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
df2
pd.merge(df1,df2) pd.merge(df1,df2,how='inner',on=['key1','key2'])
pd.merge(df1,df2,how='inner',on=['key2'])
pd.merge(df1,df2,how='outer',on=['key1','key2'])
数据分组
df.groupby(【分组的字段】).agg({'列':’集合函数名‘})
获取数据:get_group
df.groupby(['city','channel']).get_group(('北京','线下'))
#分组加聚合得到数据
df.groupby(['city','channel']).agg({'revenue':'sum'})
多个:
df.groupby(['city','channel']).agg({'revenue':'mean'
,'unit_cost':'sum'})
变形:
df.groupby(['city','channel']).revenue.sum()
数据过滤
df.groupby(['列名1',...]).filter(
lambda x: dosomething returun True or False
)
# 根据城市筛选出销售额大于200的
df.groupby('city').filter(lambda x: x.revenue.mean()>200)
更多推荐
所有评论(0)