日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2023/12/14 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据清洗处理,csv,pandas,数据匹配 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

本人python新手一枚,最近畢業(yè)論文需要用python處理數據,大概就是兩年前學過一些python基礎,最近重新把python撿起來了,由于這個數據處理過程對我這種新手來說過于艱難,所以想要把它記錄下來,方便以后需要的時候再回顧,也希望其他同學遇到類似問題的時候可以更快找到解決方法~

下面正文開始

1. 要用到的庫

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

2. 遍歷文件夾,獲取文件夾下的文件路徑

#遍歷某個文件夾下的所有文件,并將其路徑存儲到列表里 #這里只遍歷了兩層,如果有更多層文件夾的話可以繼續(xù)往下遍歷 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[:, ['區(qū)域','板塊','租金', '被叫手機號', '被叫姓名','被叫時長(秒)', '撥打時間']] #這里定義的是選取該文件的哪些列,全部都保留的話可以省略這條df.to_csv('文件路徑.csv',mode='a',index=False) #這里的'a'是追加的意思,方便合并print(i)

4. 數據清洗

#去除重復數據 df2 = pd.read_csv('文件路徑',index_col=False) df2.drop_duplicates(inplace=True) print('finish part2')#把以下列的所有空值賦值為null后,刪除含有null的行 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 = ['區(qū)域','板塊','租金', '被叫手機號', '被叫姓名','被叫時長(秒)', '撥打時間'] writer.writerow(header) #下面是判斷手機號是不是以1開頭,長度為11位,如果不是就刪掉 #名字里有沒有測試這兩個字,如果有也刪掉 for line in reader:if line[4][0] != '1':#print(line[2])continueif len(line[4]) != 11:#print(line[2])continueif '測試' in line[5]:continueelse:writer.writerow(line) print('finish') f.close() f1.close()

數據清洗階段基本上就完成了,如果還有其他需求的小伙伴也可以根據上面的內容自行修改。

接下來就是進行一些數據的計算、分組統(tǒng)計和匹配等等,這里僅列出比較通用的部分。

6. 數據計算和匹配

- 分組統(tǒng)計

如果你的數據里同一個id或者同一個時間有多個值,那么就可以用pandas里的groupby函數進行分組計數、求和、求平均值等等。groupby用法很多,可自行百度。

df = pd.read_csv('文件路徑',index_col=False) g = df.groupby(['id','月份'])['被叫次數'].sum().reset_index()#這里是求每個人每個月一個被呼叫了多少次,用的是sum函數。 g.to_csv('文件路徑',mode='w',index=False)

如果需要計數的話需要用count()或size()函數,這兩個函數的區(qū)別是count()只計算有值的數,size則是就算該行有缺失值也會計算進去。

- 數據匹配

當有兩個或多個表格,它們中包含同一個唯一字段(即數據庫里的主碼)需要根據該字段進行匹配時,可以用pandas的merge函數。

left = pd.read_csv('文件路徑',index_col=False) right = pd.read_csv('文件路徑',index_col=False) #right = right.loc[:,['id','房東電話','月份']] 可以只選取其中部分字段 result = pd.merge(left,right,left_on=['注冊時間','時間'],right_on=['注冊時間','時間'],how="left") #merge用法自行百度, on參數和how參數很重要 result.to_csv('文件路徑',mode='w',index=False) print('finish!')

- 計算兩個時間之間的間隔天數

這個是參考某位大佬的,具體出處戳這里

import timedef 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 // 24return 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)

- 判斷某個房子在某月是否處于上架狀態(tài)

(在上架日期和下架日期之間)
這其實是一個非常笨的辦法,但我也想不到其他的了…
邏輯就是把上架日期和下架日期的年份和月份取出來合并到一起,即201701這種形式,然后比較大小即可。
例如201709 < 201710 <201801,那這個房子在201710的時候肯定是處于上架狀態(tài)的。

#計算房東每月總房源數量 f = open('文件路徑','r',encoding='utf-8') reader = csv.reader(f) f1 = open('文件路徑','w',encoding='utf-8') writer = csv.writer(f1) header = ['id','月份'] writer.writerow(header) for line in reader:xiajia = line[-6].split('/')#用分隔符把年月日分開print(xiajia)shangjia = line[-5].split('/')#用分隔符把年月日分開if len(xiajia[1]) == 1:month1 = '0' + xiajia[1]#以/為分隔符的日期一般月份都是不帶0的xjdate = xiajia[0] + month1else:xjdate = xiajia[0] + xiajia[1]if len(shangjia[1]) == 1:month2 = '0' + shangjia[1]sjdate = shangjia[0] + month2#print(sjdate)else:sjdate = shangjia[0] + shangjia[1]#print(sjdate) #下面就是判斷它屬于哪個月,有可能同時屬于好幾個月if int(sjdate) <= 201701 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201701')writer.writerow(l)if int(sjdate) <= 201702 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201702')writer.writerow(l)if int(sjdate) <= 201703 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201703')writer.writerow(l)if int(sjdate) <= 201704 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201704')writer.writerow(l)if int(sjdate) <= 201705 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201705')writer.writerow(l)if int(sjdate) <= 201706 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201706')writer.writerow(l)if int(sjdate) <= 201707 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201707')writer.writerow(l)if int(sjdate) <= 201708 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201708')writer.writerow(l)if int(sjdate) <= 201709 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201709')writer.writerow(l)if int(sjdate) <= 201710 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201710')writer.writerow(l)if int(sjdate) <= 201711 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201711')writer.writerow(l)if int(sjdate) <= 201712 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201712')writer.writerow(l)if int(sjdate) <= 201801 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201801')writer.writerow(l)if int(sjdate) <= 201802 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201802')writer.writerow(l)if int(sjdate) <= 201803 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201803')writer.writerow(l)if int(sjdate) <= 201804 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201804')writer.writerow(l)if int(sjdate) <= 201805 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201805')writer.writerow(l)if int(sjdate) <= 201806 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201806')writer.writerow(l)if int(sjdate) <= 201807 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201807')writer.writerow(l)if int(sjdate) <= 201808 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201808')writer.writerow(l)if int(sjdate) <= 201809 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201809')writer.writerow(l)if int(sjdate) <= 201810 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201810')writer.writerow(l)if int(sjdate) <= 201811 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201811')writer.writerow(l)if int(sjdate) <= 201812 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201812')writer.writerow(l)if int(sjdate) <= 201901 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201901')writer.writerow(l)if int(sjdate) <= 201902 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201902')writer.writerow(l)if int(sjdate) <= 201903 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201903')writer.writerow(l)if int(sjdate) <= 201904 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201904')writer.writerow(l)if int(sjdate) <= 201905 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201905')writer.writerow(l)if int(sjdate) <= 201906 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201906')writer.writerow(l)if int(sjdate) <= 201907 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201907')writer.writerow(l)if int(sjdate) <= 201908 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201908')writer.writerow(l)if int(sjdate) <= 201909 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201909')writer.writerow(l)if int(sjdate) <= 201910 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201910')writer.writerow(l)if int(sjdate) <= 201911 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201911')writer.writerow(l)if int(sjdate) <= 201912 <= int(xjdate):l = []l.append(line[0])l.append(line[1])l.append('201912')writer.writerow(l) f.close() f1.close()

最最后,立個小小的flag,今年一定要更深入的學習python和sql,希望所有的數據人都能快樂(哭)。
如果有大佬有更好的方法,請多多指教。

總結

以上是生活随笔為你收集整理的Python数据清洗处理,csv,pandas,数据匹配的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。