Python之Pandas 簡介與Pandas 讀取csv文件及相關操作01


1.Pandas簡介

Pandas處理以下三個數據結構 -

  • 系列(Series)
  • 數據幀(DataFrame)
  • 面板(Panel)
這些數據結構構建在 Numpy數組之上,這意味着它們很快
考慮這些數據結構的最好方法是,較高維數據結構是其較低維數據結構的容器。 例如, DataFrameSeries的容器, PanelDataFrame的容器。
DataFrame被廣泛使用,是最重要的數據結構之一。面板使用少得多。
數據幀( DataFrame)是一個具有異構數據的二維數組。 例如,
上表表示具有整體績效評級組織的銷售團隊的數據。數據以行和列表示。每列表示一個屬性,每行代表一個人。
2.Pandas讀取csv文件
pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=None, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, doublequote=True, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None)
常用參數解釋:read_csv與read_table常用的參數(更多參數查看官方手冊):

filepath_or_buffer #需要讀取的文件及路徑
sep / delimiter 列分隔符,普通文本文件,應該都是使用結構化的方式來組織,才能使用dataframe
header 文件中是否需要讀取列名的一行,header=None(使用names自定義列名,否則默認0,1,2,...),header=0(將首行設為列名)
names 如果header=None,那么names必須制定!否則就沒有列的定義了。
shkiprows= 10 # 跳過前十行 
nrows = 10 # 只去前10行 
usecols=[0,1,2,...] #需要讀取的列,可以是列的位置編號,也可以是列的名稱
parse_dates = ['col_name'] # 指定某行讀取為日期格式 
index_col = None /False /0,重新生成一列成為index值,0表示第一列,用作行索引的列編號或列名。可以是單個名稱/數字或由多個名稱/數宇組成的列表(層次化索引)
error_bad_lines = False # 當某行數據有問題時,不報錯,直接跳過,處理臟數據時使用 
na_values = 'NULL' # 將NULL識別為空值
encoding='utf-8' #指明讀取文件的編碼,默認utf-8

 讀取csv/txt/tsv文件,返回一個DataFrame類型的對象。

案例分析:

(1)參數只有csv文件的路徑,其他保持默認

 在讀取的時候,默認會將第一行記錄當成列名。如果沒有列名,我們可以指定header=None。
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv') #hotelreviews50_1.csv文件與.py文件在同一級目錄下
print(df.head(3)) #讀取前3行

控制台輸出:

從輸出可見,默認會將第一行當成列名

(2)在讀數之后自定義標題

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv') #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
df.columns=columns_name
print(df.head(3)) #讀取前3行

控制台輸出:

(3)csv文件沒有列標題,從第一行就直接開始是數據的錄入了

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
df.columns=columns_name
print(df.head(3)) #讀取前3行

這個時候一定要加'header=None', 這樣讀進來的列名就是系統默認的0,1,2... 序列號

由上可見編號為201 的數據讀進來了。

(4)使用pandas讀取csv文件的指定列方法:pd.read_csv("filepath",usecols=[0,1,2,...],[encoding='編碼'])

讀取csv文件中每行的前3列

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行

控制台輸出:

(5)pandas 在Dataframe中新添加一列

其實在Dataframe中新添加一列很簡單,直接指明列名,然后賦值就可以了。

 

df['split_word_result']='new'
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
df.columns=columns_name
df['split_word_result']='new'
print(df.head(3))

控制台輸出:

3.Pandas查看數據表信息 

(1)維度查看

利用df.shape

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
print(df.shape)

控制台輸出:

 (2)數據表基本信息(維度、列名稱、數據格式、所占空間等)

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
print(df.info())

控制台輸出:

D:\softwaretools\anaconda\python.exe D:/pycharmprojects/hoteltest01/hoteltest01/test_csv_pandas.py
   mysql_id   hotelname customername     reviewtime
0       201  杭州馬可波羅假日酒店        _***7  發表於2020-05-25
1       202  杭州馬可波羅假日酒店        舟***貓  發表於2020-04-10
2       203  杭州馬可波羅假日酒店        1***8  發表於2020-05-05
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50 entries, 0 to 49
Data columns (total 4 columns):
mysql_id        50 non-null int64
hotelname       50 non-null object
customername    50 non-null object
reviewtime      50 non-null object
dtypes: int64(1), object(3)
memory usage: 1.6+ KB
None

(3)每一列數據的格式

利用df.dtypes

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
print(df.dtypes)

控制台輸出:

D:\softwaretools\anaconda\python.exe D:/pycharmprojects/hoteltest01/hoteltest01/test_csv_pandas.py
   mysql_id   hotelname customername     reviewtime
0       201  杭州馬可波羅假日酒店        _***7  發表於2020-05-25
1       202  杭州馬可波羅假日酒店        舟***貓  發表於2020-04-10
2       203  杭州馬可波羅假日酒店        1***8  發表於2020-05-05
mysql_id         int64
hotelname       object
customername    object
reviewtime      object
dtype: object

(4)查看前3行數據、后3行數據

df.head() #默認前10行數據,注意:可以在head函數中填寫參數,自定義要查看的行數
df.tail() #默認后10 行數據

import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
print(df.tail(3)) #讀取后3行

控制台輸出:

4.數據清洗
(1)空值NAN值處理方法
<1>用數字0填充空值:
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
df.fillna(value=0,inplace=True)
print(df.head(3))

注意:df.fillna不會立即生效,需要設置inplace=True

控制台輸出:

<2>
(2)清除city字段的字符空格
字符串(str)的頭和尾的空格,以及位於頭尾的\n \t之類給刪掉
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
df['customername']=df['customername'].map(str.strip)
print(df.head(3))

(3)大小寫轉換

df['customername']=df['customername'].str.lower()
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
df['customername']=df['customername'].str.lower()
print(df.head(3))

控制台輸出:

(4)刪除重復出現的值

df.drop_duplicates(['customername'],inplace=True)
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
df.drop_duplicates(['customername'],inplace=True)
print(df.head(3)) #讀取前3行

控制台輸出:

(5)數據替換

df['customername'].replace('111','qqq',inplace=True)
import pandas as pd
df=pd.read_csv('hotelreviews50_1.csv',header=None,usecols=[0,1,2,3]) #hotelreviews50_1.csv文件與.py文件在同一級目錄下
#在讀數之后自定義標題
# columns_name=['mysql_id','hotelname','customername','reviewtime','checktime','reviews','scores','type','room','useful','likenumber']
columns_name=['mysql_id','hotelname','customername','reviewtime']
df.columns=columns_name
print(df.head(3)) #讀取前3行
df['customername'].replace('111','qqq',inplace=True)
print(df.head(3)) #讀取前3行

控制台輸出:

(6)修改某行某列的數據
<1>方法1
df.loc[index,'review_split']=review_split
df.loc[index,'review_pos']=review_pos
df.loc[index,'review_split_pos']=review_split_pos

注意:index為行索引,'review_split'、'review_pos'、'review_split_pos'為列名

<2>方法2 

csv2.iloc[index, 5] ="hello"
參考文獻:https://www.yiibai.com/pandas

 https://blog.csdn.net/qq_42196922/article/details/90043750    非常經典

https://www.cnblogs.com/zhuminghui/p/9401489.html 究極推薦

https://blog.csdn.net/gaozhanfire/article/details/95653196     iloc與loc函數的使用教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM