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...