Pandas對於CSV的簡單操作
最近在研究pandas對於csv文件的讀取以及一些操作,網上的信息比較亂,寫篇博客記錄一下,畢竟自己寫的才是最適合自己的用法.
首先我們應該都知道,pandas是一個用於數據分析,以及可以簡單的繪圖的一個python模塊,本文並不是從零開始介紹這個模塊,而是從我最近幾天的使用來說的,從我用到的,最實用的那一部分說起.
首先,導入模塊,這是必須的
import pandas as pd # 不要問我為什么要簡稱pd,大家都是這么做的,慣例,日常習慣好伐
import numpy as np
導入模塊之后,我們就需要導入CSV文件,對,就是這么直奔主題,我這里不會講什么series,也不會講什么numpy數組,那些理論都不實用,我們就是要直接用,碰到問題再去解決.
讀取csv文件的方法叫做
read_csv() 讀取csv文件
df = pd.read_csv(filename,usecols=[要取的列名])
'''
read_csv的參數很多,有需求可以去查,因為我這里只是用到了要取到的列名,所以只寫這一個,當然你可以寫encoding="utf-8"來防止讀取時候中文有亂碼,或者等等之類的.
filename可以是當前文件夾里的文件名,或者是從根目錄開始的一個路徑,比如下例
usecols = [] 這里寫要取的列名,如果不想取csv文件的全部列的話,就在這里設定,如果要取全文件可以不寫.
'''
df = pd.read_csv('111.csv',usecols=['teacher','student'])
# 或者
df = pd.read_csv(r'D:\PythonStudying\111.csv',usecols=['teacher','student'])
# 兩種讀取方法都可以
# 對於一些數據量比較大的表格,我們可以選擇用分塊讀取的方式來加快讀取的速度以及減小系統的內存占用,這種讀取方法借鑒於
https://blog.csdn.net/jambone/article/details/78769421
reader = pd.read_csv(filename, encoding="utf_8_sig", sep=',', iterator=True, usecols=line)
i = 0
while True:
try:
start2 = time.clock()
df = reader.get_chunk(1000000)
i = i + 1
end2 = time.clock()
# 每次循環結束時間
print('{} 秒: completed {} rows'.format(end2 - start2, i * 1000000))
except StopIteration:
print("Iteration is stopped.")
# 循環結束退出
break
然后,我們成功讀取到之后,可以嘗試用print(df)
來查看取到的csv列表
合並一個表中的不同列(單純的合並,不做計算)
我們可以把讀取到的csv表中的不同列合並成一列,其實也不算是合並,只能說是新的生成.
df["User"] = df["ClientID"].map(str)+df["UserID"].map(str)+df["phone"].map(str)
# 我們知道,只有字符串或者數值之間才能直接相加,所以我們要清楚的知道自己合並的這幾列是什么格式的數據,如果當做字符串合並,那么就在每列結尾用map(str),如果要用數值相加,那么要用map(float)或者map(int)
# 這樣合並原來的列並不會消失,只是會形成一個新列,默認在整個表的尾部,也就是最后一列,如果需要把原列刪除再調用drop即可
apply() 一個表中的不同列,行之間做計算
tablename['time'] = df.apply(
lambda x: x['second']+x['minute']*60),
axis=1)
# 上面語句的意思就是,把名為second的列的值加上名為minute的列的值乘以60,作為一個叫做time的新列
# lambda 是匿名函數的意思,即傳入一個x參數,返回的是冒號后面的式子的結果
# axis的參數和上文相同,0代表對行操作,1代表對列操作
# 要注意一點,apply是一個非常耗時的操作,數據量較大的話要慎用這個函數,我曾經測試過,60W行的csv表,對列做操作,用apply耗時20s,直接用列操作只用時5s,所以要注意
# 直接用列之間操作如下:
tablename['time'] = tablename['second']+tablename['minute']*60
drop() 刪除表中列,行
# 刪除某一列或者某一行,用drop
df.drop(columns=line_name,axis)
# 第一個參數columns即為你要刪除的列或者行的名字,可以是一個值,也可以是一個隊列多個值
# 第二個參數axis則是你要刪除的是列還是行:
# axis=0,就是刪除名為line_name的行
# axis=1,就是刪除名為line_name的列
merge() 合並兩個表
pd.merge(table1, table2, on=line_name,how = )
# merge是合並函數,前面兩個參數即為要合並的兩個表的名稱
# 第三個參數on,是按照某一列或者某些列來合並表,比如on=['student','teacher'],就是同時按照這兩列來合並表,作為key
# 第四個參數how,就是合並的方式,可填參數為inner內聯,left左連接,right右連接,outer全連接,這里解釋一下這幾種合並方式的區別
1. inner 內聯,即兩個表以key為關鍵字合並之后,如果某個其余列有空的數值,那么這一列將不會保留,即內聯方式只會保留兩個表相對於key都有數據的行,或者列,有空數據都不會保留
2. left 左連接,即左邊的所有數據都會保留,也就是table1的數據,右表如果有空數據,會自動填入null
3. right 右連接,原理同左連接,換個方向而已
4. 全連接,即兩邊表的所有數據都會保留,如果有空數據都會自動填入null
# 實例:
pd.merge(df1, df2, on=["student","teacher"],how = "outer")
to_csv() 創建新表
# 當我們讀入一些csv表,然后對他們操作完畢之后,我們就需要把處理之后的數據輸出,重新生成一個表,就要用到這個函數
df.to_csv(filename, encoding="utf_8_sig")
# 第一個參數就是你要生成的文件名,只寫一個文件名的話會默認生成到你的py文件所在的目錄,當然可以寫一個從根目錄開始的路徑,注意要加引號
# 第二個參數一定要加,這個參數可以避免重新生成的csv表里面的中文出現亂碼
這都是對csv表的基本操作,還在學習當中,持續更新ing........