文件读取和存储

读取:

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)
  1. 遍历 DataFrame 的每一列(for col_name in df.columns
  2. 检查该列是否存在缺失值(df[col_name].isnull().sum() > 0
  3. 如果存在缺失值,则用该列的平均值填充这些缺失值(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)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐