Pandas的一些技巧分享

2021-10-01 05:06:07 字數 3913 閱讀 8615

pandas 是乙個廣泛應用於資料分析等領域的 python 庫。關於它的教程有很多,但這裡會一些比較冷門但是非常有用的技巧。

read_csv

這是乙個大家都應該知道的函式,因為它就是讀取 csv 檔案的方法。

但如果需要讀取資料量很大的時候,可以新增乙個引數--nrows=5,來先載入少量資料,這可以避免使用錯誤的分隔符,因為並不是所有的都採用逗號分隔,然後再載入整個資料集。

ps. 在 linux 的終端,可以採用head命令來檢視檔案的前 5 行資料,命令示例如下所示:

head -n 5 data.txt

複製**

載入資料後,可以通過方法df.columns.tolist()獲取所有的列名字,再採用引數usecols=['c1','c2',...]來讀取真正需要的列。如果想讀取速度更快並且知道一些列的資料型別,可以使用引數dtype=,使用這個引數的另乙個好處是對於包含不同型別的列,比如同時包含字串和整型的列,這個引數可以指定該列就是字串或者整型的型別,避免在採用該列作為鍵進行融合不同表的時候出現錯誤。

select_dtypes

如果必須用 python 進行資料預處理,採用這個方法可以節省一些時間。在讀取表後,預設資料型別可以能是bool, int64, float64, object, category, timedelta64, datetime64,首先可以用下面的方法來檢視分布情況和知道dataframe中包含哪些資料型別:

df.dtypes.value_counts()

接著使用下面的方法來選擇特定型別的資料,比如說數字特徵:

df.select_dtypes(include=['float64', 'int64'])

copy

這個方法很重要,首先先看看下面這個例子:

import pandas as pd

df1 = pd.dataframe()

df2 = df1

df2['a'] = df2['a'] + 1

df1.head()

複製**

執行上述**後,會發現df1的數值被改變了,這是因為df2=df1這段**並不是對df1進行拷貝,然後賦給df2,而是設定了乙個指向df1的指標。 因此任何對df2的改變都會改變df1,如果要修改這個問題,可以採用下面的**:

df2 = df1.copy()

複製**

或者

from copy import deepcopy

df2 = deepcopy(df1)

複製**

map

這是乙個非常酷的命令,可以用於做簡單的資料轉化操作。首先需要定義乙個字典,它的鍵是舊數值,而其值是新的數值,如下所示:

level_map = 

df['c_level'] = df['c'].map(level_map)

複製**

還有一些例子:

def rule(x, y):

if x == 'high' and y > 10:

return 1

else:

return 0

df = pd.dataframe()

df.head()

複製**

複製**

但你會發現比下面這段**要慢很多:

df['maximum'] = df[['c1','c2']].max(axis=1)

複製**

value_counts

這個方法用於檢查數值的分布情況。比如,你想知道c列的每個唯一數值出現的頻繁次數和可能的數值,可以如下所示:

df['c'].value_counts()

複製**

這裡還有一些有趣的技巧或者引數:

normalize=true:如果想看頻率而不是次數,可以使用這個引數設定;

dropna=false:檢視包含缺失值的統計

df['c'].value_counts().reset_index():如果想對這個統計轉換為乙個dataframe並對其進行操作

df['c'].value_counts().reset_index().sort_values(by='index')或者是df['c'].value_counts().sort_index(): 實現根據列的每個取值對統計表進行排序

number of missing values

當構建模型的時候,我們希望可以刪除掉帶有太多缺失值的行,或者都是缺失值的行。這可以通過採用.isnull().sum()來計算特定列的缺失值數量:

import pandas as pd

import numpy as np

df = pd.dataframe()

df = df[['id', 'c1', 'c2']]

df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1)

df.head()

複製**

select rows with specific ids

在 sql 中這個操作可以通過select * from … where id in (『a001』, 『c022』, …)來獲取特定 ids 的記錄。而在 pandas 中,可以如下所示:

df_filter = df['id'].isin(['a001','c022',...])

df[df_filter]

複製**

percentile groups

假設有乙個都是數值型別的列,然後希望對這些數值劃分成幾個組,比如前 5% 是第一組,5-20%是第二組,20%-50%是第三組,最後的50%是第四組。這可以採用.cut方法,但這有另外乙個選擇:

import numpy as np

cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]]

df['group'] = 1

for i in range(3):

df['group'] = df['group'] + (df['c'] < cut_points[i])

# or <= cut_points[i]

複製**

這個方法的速度非常快。

to_csv

最後是乙個非常常用的方法,儲存為csv檔案。這裡也有兩個小技巧:

第乙個就是print(df[:5].to_csv()),這段**可以列印前5行,並且也是會儲存到檔案的資料。

另乙個技巧是處理混合了整數和缺失值的情況。當某一列同時有缺失值和整數,其資料型別是float型別而不是int型別。所以在匯出該錶的時候,可以新增引數float_format='%.of'來將float型別轉換為整數。如果只是想得到整數,那麼可以去掉這段**中的。

pandas使用的一些技巧

偶然學到了一些技巧,不知道寫在哪兒,就記在這吧,持續更新ing loc是最慢的。盡量用ix代替。pandas 存在 df.iterrows 的generator 來迴圈dataframe 的 row,這樣的效率是最高的。文件丟在這 轉乙個部落格作為參考 我用的時候 for i,row in tqdm...

Erlang的一些程式設計技巧分享

guard guard可以以逗號或者分號分隔,以逗號分隔表示最終的結果為各個guard的and結果,以分號則是只要任意乙個guard為true則最終結果為true。複製 如下 guard x,y when not x y is ato程式設計客棧m x x y.guard在list comprehe...

Pandas處理「大」資料的一些技巧

實習定下來下的空檔期,抽空參加了一些大資料競賽,pandas用的比較多,所以這裡彙總下pandas的一些使用心得和總結一些遇到過的問題吧。import pandas as pd res for dfs in pd.read csv data.csv chunksize 1000 iterator t...