Pandas學習總結——1. 基礎操作(文件讀寫)、數據結構(Series、DataFrame)、常用基本函數、數據排序


1 Pandas文件讀取和寫入

1.1 文件讀取(csv、txt、xls/xlsx)

# 讀取 csv 文件
pandas.read_csv( )

# 讀取 txt 文件
pandas.read_table( )

# 讀取 xls/xlsx 文件
pandas.read_excel( )    # 需要安裝openpyxl

1.2 文件寫入(csv、xls/xlsx)

# 寫入 csv 文件
pandas.to_csv( )

# 寫入 xls/xlsx 文件
pandas.to_excel( )

2 Pandas基本數據結構(Series、Dataframe)

2.1 Series

(1)創建Series
官方文檔上定義Series是軸標簽為索引的一維數組(包含時間序列)。
參數有:

  • data:數據。
  • index:索引
  • dtype:輸出數據的類型
  • name:Series名稱
  • copy:復制數據。bool型,默認為False
s = pd.Series(np.random.randn(5),
                  index=['a','b','c','d','e'],
                  name='這是一個Series',
                  dtype='float64')

(2)訪問Series屬性
Series有很多屬性,如value、size、shape、T等。
可以通過Series_name.Attributes來訪問屬性。如:

s.values

(3)訪問Series方法
用法類似訪問屬性的操作。

2.2 DataFrame

DataFrame是一個二維的數據結構。
函數原型是:DataFrame([data, index, columns, dtype, copy])
(1) 創建一個DataFrame

df = pd.DataFrame({'col1':list('abcde'),'col2':range(5,10),'col3':[1.3,2.5,3.6,4.6,5.8]},
                 index=list('一二三四五'))

(2)行列操作

  • 取出一列:df['col1']

  • 修改行/列名:df.rename(index={'一':'one'}, columns={'col1':'new_col1'})

  • 調用屬性和方法

  • 刪除行列。(兩種方法:drop()pop()

    • drop()inplace=False不改變原DataFrame中的行列,
    • pop() 方法直接在原來的DataFrame上操作,且返回被刪除的列,與python中的pop函數類似
df.drop(index='五',columns='col1',inplace=False)

  • 增加行列
    • 直接增加:
    • 使用assign方法。但assign方法不會對原DataFrame做修改

(3) DataFrame的索引對其特性

df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])
print(df1)
print(df2)
df1-df2     #由於索引對齊,因此結果不是0

(4) 根據類型選擇列

df.select_dtypes(include=['number']).head()

(5) Series轉換為DataFrame

s = df.mean()
s.to_frame()

3 Pandas常用基本函數

(1) head和tail

  • data.head() :返回data的前幾行數據,默認為前五行,需要前十行則data.head(10)
  • data.tail() :返回data的后幾行數據,默認為后五行,需要后十行則data.tail(10)

(2) unique和nunique

  • data['column'].nunique():顯示有多少個唯一值
  • data['column'].unique():顯示所有的唯一值

(3) count和value_counts

  • data['column'].count():返回非缺失值元素個數
  • data['column'].value_counts():返回每個元素有多少個

(4) describe和info

  • data.info():返回有哪些列、有多少非缺失值、每列的類型
  • data.describe():默認統計數值型數據的各個統計量。包括數量、均值、最大最小值、分位數等。
    • describe()可以自行選擇分位數。表達式為:df.describe(percentiles=[.05, .25, .75, .95])
  • describe()也可以用於非數值型數據df['Physics'].describe()

(5) idxmax和nlargest

  • data['column'].indxmax():idxmax函數返回最大值。idxmin功能類似
  • data['column'].nlargest(num):nlargest函數返回前num個大的元素值,nsmallest功能類似

(6) clip和replace

  • data['column'].clip(low, up):對超過up或者低於low的數進行截斷

  • data['column'].replace(num):replace是對某些值進行替換。也可以通過字典直接在表中修改。

(7) apply()函數

apply是一個自由度很高的函數。對於Series,它可以迭代每一列的值操作;對於DataFrame,它可以迭代每一個列操作。

df['Math'].apply(lambda x:str(x)+'!').head() #可以使用lambda表達式,也可以使用函數

df.apply(lambda x:x.apply(lambda x:str(x)+'!')).head() #這是一個稍顯復雜的例子,有利於理解apply的功能

4 Pandas排序操作

(1) 索引排序

sort_index()可以設置ascending參數為升序(True)或者降序(False),默認升序

df.set_index('Math').head() #設置索引
df.set_index('Math').sort_index().head()

(2) 值排序

df.sort_values(by='Class').head()

多個值排序,即先對第一層排,在第一層相同的情況下對第二層排序

df.sort_values(by=['Address','Height']).head()

5 問題

【問題一】 Series和DataFrame有哪些常見屬性和方法?

  • Series

    • 屬性:values、 index、、name、dtype
    • 方法:mean、T、abs、array、append ......
  • DataFrame

    • 屬性:columns、index、value、shape
    • 方法:mean

【問題二】 value_counts會統計缺失值嗎?
答:不會。

df = pd.DataFrame({'col1':[1, 1, 2], 'col2':[3, 4, np.nan]})
df['col1'].value_counts()
df['col2'].value_counts()

【問題三】 與idxmax和nlargest功能相反的是哪兩組函數?
答: indxmin()nsmallest()

【問題四】 在常用函數一節中,由於一些函數的功能比較簡單,因此沒有列入,現在將它們列在下面,請分別說明它們的用途並嘗試使用。

  • sum:求指定軸的。用法:data.sum(axis=0)
  • mean:求指定軸的平均數。用法:data.mean()
  • median:求指定軸的中位數。用法:data.median()
  • mad:求指定軸的平均絕對離差
  • min:求指定軸的最小值
  • max:求指定軸的最大值
  • abs:元素的絕對值
  • std:求指定軸樣本的標准偏差,默認ddof=1
  • var:求指定軸的方差,默認ddof=1
  • quantile:求指定軸的分位數,參數q默認為0.5,\(q \in [0, 1]\)
  • cummax:求指定軸上積累的最大值。默認情況下,NaN值會被忽略,若要包含NaN,則需要使參數skipna=False
  • cumsum:求累計和
  • cumprod:求累計乘cumsumcumprod可以用來看數據的變化趨勢,累加是通過流量得到存量,比如每天銷售量的多少,得到今年的銷售量總量;累乘是通過變化率來得到存量,比如有每天的數據變動趨勢,通過累乘來得到當前的數據。

【問題五】 df.mean(axis=1)是什么意思?它與df.mean()的結果一樣嗎?第一問提到的函數也有axis參數嗎?怎么使用?

  • axis=1是對1軸進行操作。在DataFrame中,0軸是index軸,1軸是column軸。
  • 正因為如此,df.mean()對0軸和1軸操作的結果肯定是不一樣的。
  • 屬性沒有axis參數,方法有axis參數,用法個人認為是一樣的。







如什么問題,歡迎留言交流,覺得有用的小伙伴順手點個贊吧。

你的肯定是我的最大動力!


免責聲明!

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



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