Python数据清洗处理,csv,pandas,数据匹配

本人python新手一枚,最近毕业论文需要用python处理数据,大概就是两年前学过一些python基础,最近重新把python捡起来了,由于这个数据处理过程对我这种新手来说过于艰难,所以想要把它记录下来,方便以后需要的时候再回顾,也希望其他同学遇到类似问题的时候可以更快找到解决方法~

下面正文开始

1. 要用到的库

import os
import pandas as pd
import openpyxl
import csv
import xlrd

2. 遍历文件夹,获取文件夹下的文件路径


def get_files():
    l = []
    directory = '文件夹路径'
    for f in os.listdir(directory):
        file_path = os.path.join(directory,f)
        for folder in os.listdir(file_path):
            files = os.path.join(file_path, folder)
        l.append(files)
    return l
path = get_files()

3. 文件合并

如果上面文件夹里的文件是xlsx文件,则直接使用pd.read_excel()函数。
如果是xls文件,则使用pd.read_excel(文件路径,engine=’xlrd’, index_col=False)

for i in path:
    df = pd.read_csv(i,index_col=False)
    df = df.loc[:, ['区域','板块','租金', '被叫手机号', '被叫姓名','被叫时长(秒)', '拨打时间']]
    df.to_csv('文件路径.csv',mode='a',index=False)
    print(i)

4. 数据清洗


df2 = pd.read_csv('文件路径',index_col=False)
df2.drop_duplicates(inplace=True)
print('finish part2')

df2['被叫手机号'] = df2['被叫手机号'].fillna('null')
df2 = df2[~df2['被叫手机号'].isin(['null'])]
df2.to_csv('文件路径',mode='w',index=False)
print('finish part3')

5. 遍历csv文件的每一行

因为我的数据需要,pandas里面我不知道怎么去遍历每一行,所以我用了csv这个包,如果某一行的数据不符合要求就删掉,把符合要求的写进一个新的csv里面

import csv
l = []
f = open('文件路径','r',encoding='utf-8')
reader = csv.reader(f)
f1 = open('文件路径','w+',encoding='utf-8',newline='')
writer = csv.writer(f1)
header = ['区域','板块','租金', '被叫手机号', '被叫姓名','被叫时长(秒)', '拨打时间']
writer.writerow(header)

for line in reader:
    if line[4][0] != '1':

        continue
    if len(line[4]) != 11:

        continue
    if '测试' in line[5]:
        continue
    else:
        writer.writerow(line)
print('finish')
f.close()
f1.close()

数据清洗阶段基本上就完成了,如果还有其他需求的小伙伴也可以根据上面的内容自行修改。

接下来就是进行一些数据的计算、分组统计和匹配等等,这里仅列出比较通用的部分。

6. 数据计算和匹配

如果你的数据里同一个id或者同一个时间有多个值,那么就可以用pandas里的groupby函数进行分组计数、求和、求平均值等等。groupby用法很多,可自行百度。

df = pd.read_csv('文件路径',index_col=False)
g = df.groupby(['id','月份'])['被叫次数'].sum().reset_index()
g.to_csv('文件路径',mode='w',index=False)

如果需要计数的话需要用count()或size()函数,这两个函数的区别是count()只计算有值的数,size则是就算该行有缺失值也会计算进去。

当有两个或多个表格,它们中包含同一个唯一字段(即数据库里的主码)需要根据该字段进行匹配时,可以用pandas的merge函数。

left = pd.read_csv('文件路径',index_col=False)
right = pd.read_csv('文件路径',index_col=False)

result = pd.merge(left,right,left_on=['注册时间','时间'],right_on=['注册时间','时间'],how="left")
result.to_csv('文件路径',mode='w',index=False)
print('finish!')
import time

def demo(day1, day2):
    time_array1 = time.strptime(day1, "%Y/%m/%d")
    timestamp_day1 = int(time.mktime(time_array1))
    time_array2 = time.strptime(day2, "%Y/%m/%d")
    timestamp_day2 = int(time.mktime(time_array2))
    result = (timestamp_day2 - timestamp_day1) // 60 // 60 // 24
    return result
df = pd.read_csv('文件路径',index_col=False)
renttype_dummy = pd.get_dummies(df['租赁类型'])
df = df.join(renttype_dummy)
df.to_csv('文件路径',mode='w',index=False)

(在上架日期和下架日期之间)
这其实是一个非常笨的办法,但我也想不到其他的了…

逻辑就是把上架日期和下架日期的年份和月份取出来合并到一起,即201701这种形式,然后比较大小即可。
例如201709 < 201710

Original: https://blog.csdn.net/weixin_49373789/article/details/123347213
Author: Healer1587
Title: Python数据清洗处理,csv,pandas,数据匹配

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/738440/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球