当前位置: 移动技术网 > IT编程>脚本编程>Python > pandas 数据清洗和分析(一)

pandas 数据清洗和分析(一)

2020年07月20日  | 移动技术网IT编程  | 我要评论

python是一款非常好的数据分析工具。高自由度和丰富的第三方库的支持,对于大部分行业的数据分析非常友好,其中最为常用的数据清洗和分析第三方库是numpy和pandas。常用的xlsx、csv、txt数据读取、合并、缺失值处理、重复值处理、异常值处理以及切片替换等操作都比较简单且容易查询。本文主要介绍一些实际工作中用到的一些方法。

1、数据读取和导出经验

1)pandas连接mysql

from sqlalchemy import create_engine    
def import_data_mysql(df,table):
    """
        数据导入mysql
    """
    engine = create_engine('mysql+pymysql://root:‘密码’@‘地址’:‘端口’/‘库’?charset=utf8')
    df1.to_sql(name = table,#表名
          con = engine,
          if_exists = 'append',
          index = False)
    return df

# 数据提取为dataframe
def extract_data(sql_text):
    engine = create_engine('mysql+pymysql://root:‘密码’@‘地址’:‘端口’/‘库’?charset=utf8')
    sql = sql_text
    df = pd.read_sql_query(sql, engine)
    return df

2)大数据文件读取(应对memory error问题)

通过chunksize数据块

#读取大文件chunksize
df = pd.read_csv(os.path.join(path, filename),encoding='gb18030',iterator=True,sep='|')

def import_chunks_data(df,chunksize):
    loop = True
    chunkSize = chunksize
    chunks = []
    index=0
    while loop:
        try:
            print(index)
            chunk = df.get_chunk(chunkSize)
            chunks.append(chunk)
            index+=1
        except StopIteration:
            loop = False
    print("Iteration is stopped.")
    return chunks

full_ls =  import_chunks_data(df,30000)#输出结果是list

2、迭代的技巧,enumerate、exec和zip

enumerate相当于给每个元素加了索引,即索引与元素一一对应

exec 执行储存在字符串或文件中的Python语句,可以实现对多个dataframe或者变量的执行操作

zip 实现将对象对应的元素打包成元组,然后返回由这些元组组成的列表

from docx import Document  
for m,doc in enumerate(document):#从document文件中提取表格数据为dataframe
        for table in doc.tables:
            df = [['' for i in range(len(table.columns))] for j in range(len(table.rows))]
            for i, row in enumerate(table.rows):
                for j, cell in enumerate(row.cells):
                    df[i][j] = cell.text
            exec('co'+'_'+str(m)+'.append(pd.DataFrame(df))')
#zip
ls1 = [a,b,c]
ls2 = [d,e,f]
ziped = list(zip(ls1,ls2))
for i in ziped:
    print(sum_jihuo(full_jh,i[0],i[1]))

3、pandas数据概览报告

pandas_profiling库可实现对数据概览分析 生成html报告,包含数据分布、缺失值、重复性等内容

import pandas_profiling
profile = raw_data.profile_report(title="oil_data")
profile.to_file(output_file="oil_data.html")

4、dataframe 数据append

for i in unique_Asset:
    a = df_merge[df_merge['Asset Number']==str(i)]
    ziped = list(zip(a['Latitude'].to_list(),a['Longitude'].to_list()))
    for j,dis in enumerate(ziped):
        #print(j,dis)
        df_distance = df_distance.append(pd.DataFrame({"设备编码":a['Asset Number'].iloc[j],
                                       "巡检结束时间":a['Inspection EndTime'].iloc[j],
                                       "纬度":a['Latitude'].iloc[j],
                                       "经度":a['Longitude'].iloc[j],
                                       "直线距离(m)":round(geodesic(ziped[0],dis).m,2)},index=[0]),ignore_index = True)

5、rank排名

#取排名
full['rank'] = full.groupby(['class_id'])['score'].rank(ascending=False,method='min')
#降序排序,method='min'模式为1224,dense模式1223,max模式为1334

6、等比例分层抽样

DataFrame.sample(n,frac,replace=False)

n 按个数抽样 frac 按百分比抽样 replace 是否放回抽样,默认false为不放回

#单维度整群抽样
label_unique = list(df['省份'].unique()) # 定义标签值域
full = pd.DataFrame()
for i in label_unique:
    df_x = df[df['省份']==i].sample(frac=0.3) #30%比例
    full = pd.concat([full,df_x],ignore_index=True)

7、条件赋值

#多条件分别赋值:条件一,结果一、条件二、结果二
df['new'] = np.select([condition1,condition2,...],[val1,val2,...],other)

本文地址:https://blog.csdn.net/weixin_42305022/article/details/107450739

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网