Python庫的實用技巧專欄

MedusaSorcerer的博客


專欄目錄

專欄詳情

collections

官方文檔: https://docs.python.org/2/library/collections.html#collections.Counterhtml

對列表數據元素進行數量統計

from collections import Counter

test_list = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]

counter = Counter(test_list)
# 返回值: Counter({1: 7, 2: 5, 3: 3})

value = counter[2]
# 返回值: 5

# 實際上以上引入等價於如下代碼:
counter = {i: test_list.count(i) for i in set(test_list)}
# 返回值: {1: 7, 2: 5, 3: 3}
複製代碼

對列表數據元素進行TOP統計

from collections import Counter

test_list = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]

counter = Counter(lst)
result = counter.most_common(2)  # 統計TOP2
# 返回值: [(1, 7), (2, 5)]
複製代碼

對列表數據元素進行統計值相減

from collections import Counter

test1 = Counter(a=4, b=2, c=0, d=-2)
test2 = Counter(a=1, b=2, c=3, d=4, e=4)
test1.subtract(test2)
# 返回值:
# test1: Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
# test2: Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})
複製代碼

對列表數據元素進行統計計算

from collections import Counter

test1 = Counter(a=4, b=2, c=0, d=-2)
test2 = Counter(a=1, b=2, c=3, d=4, e=4)

result1 = test1 + test2  # counter相加: 相同Key值相加, 不一樣Key保留
result2 = test1 - test2  # counter相減: 相同Key值相減, 不一樣Key用0代替再相減, 結果只保留value是正值的key
result3 = test1 & test2  # counter交集: 取相同key, value取小
result4 = test1 | test2  # counter並集: 取全部key, key相同時value取大
# 返回值:
# result1: Counter({'a': 5, 'b': 4, 'e': 4, 'c': 3, 'd': 2})
# result2: Counter({'a': 3})
# result3: Counter({'b': 2, 'a': 1})
# result4: Counter({'a': 4, 'd': 4, 'e': 4, 'c': 3, 'b': 2})
複製代碼

defaultdict

官方文檔: https://docs.python.org/2/library/collections.html#collections.defaultdictpython

獲取Dict不存在key

from collections import defaultdict

test = defaultdict(str)
test['key1'] = '1'
test['key2'] = '2'
# 獲取不存在的Key將使用實例化的類型所對應的空對象做爲初始化數據
# str -> "" | int -> 0 | list -> list() | dict -> dict() | set -> set() | tuple -> tuple() 
v = test['medusa']

# 返回值:
# v: ""
# test: defaultdict(<class 'str'>, {'key1': '1', 'key2': '2', 'medusa': ''})
複製代碼

deque

官方文檔: https://docs.python.org/2/library/collections.html#collections.dequesql

指定長度的ListQueue

# First-In-First-Out,FIFO
from collections import deque

my_queue = deque(maxlen=10)

for i in range(10):
    my_queue.append(i+1)

print(my_queue)
# 輸出: deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)

print(my_queue.popleft())
# 輸出: 1

for i in range(5):
    my_queue.append(i+1)
print(my_qeueu)
# 輸出: deque([6, 7, 8, 9, 10, 1, 2, 3, 4, 5], maxlen=10)
複製代碼

namedtuple

官方文檔: https://docs.python.org/2/library/collections.html#collections.namedtuplejson

tuple的指定索引對象

from collections import namedtuple

# 建立數據模板, 名稱爲Person, 數據模板域名稱 name | description | forever | size
Person = namedtuple('Person', 'name description forever size')

# 使用模板建立兩個索引對象, 兩種方法等價
Medusa = Person(name='Medusa', description='Medusa blog', forever=True, size='Max')
You = Person._make(['You', '...', True, 'Max'])

print(Medusa)
print(You)
# 輸出:
# Medusa: Person(name='Medusa', description='Medusa blog', forever=True, size='Max')
# You: Person(name='You', description='...', forever=True, size='Max')

# 修改屬性值, 實際上生成了新的對象
update_Medusa = Medusa._replace(description='https://juejin.im/user/5da32395e51d4578200cc9c5')
print(Medusa)
print(update_Medusa)
# 輸出:
# Medusa: Person(name='Medusa', description='Medusa blog', forever=True, size='Max')
# update_Medusa: Person(name='Medusa', description='https://juejin.im/user/5da32395e51d4578200cc9c5', forever=True, size='Max')

# 輸出字典
print(Medusa._asdict())
# 輸出: OrderedDict([('name', 'Medusa'), ('description', 'Medusa blog'), ('forever', True), ('size', 'Max')])
複製代碼

pandas + numpy

官方文檔: https://www.pypandas.cn/app

讀取和寫入文件數據

import pandas as pd

df = pd.DataFrame(pd.read_csv('csv_name.csv',header=1)) 
df = pd.DataFrame(pd.read_excel('xlsx_name.xlsx'))
複製代碼
Read Write
read_csv to_csv
read_excel to_excel
read_hdf to_hdf
read_sql to_sql
read_json to_json
read_msgpack(experimental) to_msgpack(experimental)
read_html to_html
read_gbq (experimental) to_gbq (experimental)
read_stata to_stata
read_sas -
read_clipboard to_clipboard
read_pickle to_pickle

read_csv參數說明

  • filepath_or_buffer: str 支持字符串或者任何可讀文件對象, 包括UEL類型的文件
  • sep: str 指定數據分隔符, 默認嘗試","分隔, 分隔符長於一個字符且不是"\s+", 將使用python的語法分析器, 而且忽略數據中的逗號
  • delimiter: str 定界符, 備選分隔符, 若是指定該參數, 則sep參數失效
  • delim_whitespace: bool 指定空格是否做爲分隔符使用, 等效於設定sep="\s+", 若是這個參數設定爲"True", 則delimiter參數失效
  • header: int or list of ints 指定行數編號做爲列名, 若是文件中沒有列名則默認爲0, 不然設置爲None, 若是明確設定header=0就會替換掉原來存在列名, 若是是list表示將文件中的這些行做爲列標題(意味着每一列有多個標題), 介於中間的行將被忽略掉, 注意:若是skip_blank_lines=True, 那麼header參數忽略註釋行和空行, 因此header=0表示第一行數據而不是文件的第一行
  • names: array like 用於結果的列名列表, 若數據文件中沒有列標題行則須要執行header=None, 默認列表中不能出現重複, 除非設定參數mangle_dupe_cols=True
  • index_col : int or sequence or False 用做行索引的列編號或者列名, 若是給定一個序列則有多個行索引, 若是文件不規則, 行尾有分隔符, 則能夠設定index_col=False來使pandas不適用第一列做爲行索引
  • usecols: array-like 返回一個數據子集, 該列表中的值必須能夠對應到文件中的位置(數字能夠對應到指定的列)或者是字符傳爲文件中的列名, 例如:usecols有效參數多是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’], 使用這個參數能夠加快加載速度並下降內存消耗。
  • as_recarray: bool 不支持使用:該參數會在將來版本移除, 請使用pd.read_csv(...).to_records()替代, 返回一個Numpy的recarray來替代DataFrame, 若是該參數設定爲True, 將會優先squeeze參數使用, 而且行索引將再也不可用, 索引列也將被忽略
  • squeeze: bool 若是文件值包含一列, 則返回一個Series
  • prefix: str 在沒有列標題時, 給列添加前綴
  • mangle_dupe_cols : bool 重複的列, 將多個重複列表示爲"X.0"..."X.N", 不然將列覆蓋。
  • dtype: Type name or dict of column -> type 每列數據的數據類型
  • engine: "c" or "python" 指定分析引擎, C引擎快, 可是Python引擎功能更加完備
  • converters: dict 列轉換函數的字典, key能夠是列名或者列的序號
  • true_values: list Values to consider as True
  • false_values: list, Values to consider as False
  • skipinitialspace: bool 忽略分隔符後的空白
  • skiprows: list-like or integer 須要忽略的行數(從文件開始處算), 或須要跳過的行號列表
  • skipfooter: int 從文件尾部開始忽略
  • skip_footer: int 從文件尾部開始忽略(不推薦使用)
  • nrows: int 須要讀取的行數(從文件頭開始算起)
  • na_values: scalar, str, list-like, or dict 一組用於替換NA/NaN的值, 若是傳遞, 須要制定特定列的空值。默認爲"1.#IND", "1.#QNAN", "N/A", "NA", "NULL", "NaN", "nan"
  • keep_default_na: bool 若是指定na_values參數, 而且keep_default_na=False, 那麼默認的NaN將被覆蓋, 不然添加
  • na_filter: bool 是否檢查丟失值(空字符串或者是空值), 對於大文件來講數據集中沒有空值, 設定na_filter=False能夠提高讀取速度
  • verbose: bool 是否打印各類解析器的輸出信息
  • skip_blank_lines: bool 若是爲True, 則跳過空行, 不然記爲NaN
  • parse_dates: boolean or list of ints or names or list of lists or dict
    • 傳遞True將會解析索引
    • 傳遞list of ints or names(例如[1, 2, 3])將會解析1,2,3列的值做爲獨立的日期列
    • 傳遞list of lists(例如[[1, 3]])將會合並1,3列做爲一個日期列使用
    • 傳遞dict(例如{"foo": [1, 3]})則將1,3列合併, 並給合併後的列起名爲"foo"
  • infer_datetime_format: bool 若是設定爲True而且parse_dates可用, 那麼pandas將嘗試轉換爲日期類型, 若是能夠轉換, 轉換方法並解析。在某些狀況下會快5~10倍
  • keep_date_col: bool 若是鏈接多列解析日期, 則保持參與鏈接的列
  • date_parser: function 用於解析日期的函數, 默認使用dateutil.parser.parser來作轉換, Pandas嘗試使用三種不一樣的方式解析, 若是遇到問題則使用下一種方式
    • 使用一個或者多個arrays(由parse_dates指定)做爲參數
    • 鏈接指定多列字符串做爲一個列做爲參數
    • 每行調用一次date_parser函數來解析一個或者多個字符串(由parse_dates指定)做爲參數
  • dayfirst: bool DD/MM格式的日期類型
  • iterator: bool 返回一個TextFileReader對象, 以便逐塊處理文件
  • chunksize: int 文件塊的大小
  • compression: "infer" or "gzip" or "bz2" or "zip" or "xz" or None 直接使用磁盤上的壓縮文件, 若是使用infer參數, 將使用指定的方式解壓指定後綴的文件
  • thousands: str 千分位分割符
  • decimal: str 字符中的小數點
  • float_precision: str Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter
  • lineterminator : str 行分割符, 只在C解析器下使用
  • quotechar: str 引號, 用做標識開始和解釋的字符, 引號內的分割符將被忽略
  • quoting: int or csv.QUOTE_* instance 控制csv中的引號常量, 可選 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)
  • doublequote: bool 雙引號, 當單引號已經被定義, 而且quoting 參數不是QUOTE_NONE的時候, 使用雙引號表示引號內的元素做爲一個元素使用
  • escapechar: str 當quoting 爲QUOTE_NONE時, 指定一個字符使的不受分隔符限值
  • comment: str 標識着多餘的行不被解析, 若是該字符出如今行首, 這一行將被所有忽略, 這個參數只能是一個字符, 空行(就像skip_blank_lines=True)註釋行被header和skiprows忽略同樣, 若是指定comment='#' 解析"#empty\na,b,c\n1,2,3" 以header=0 那麼返回結果將是以’a,b,c'做爲header
  • encoding: str 指定字符集類型, 一般指定爲'utf-8'
  • dialect: str or csv.Dialect instance 若是沒有指定特定的語言, 若是sep大於一個字符則忽略
  • tupleize_cols: bool Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)
  • error_bad_lines: bool 若是一行包含太多的列, 那麼默認不會返回DataFrame, 若是設置成False, 那麼會將改行剔除(只能在C解析器下使用)
  • warn_bad_lines: bool 若是error_bad_lines=False, 而且warn_bad_lines=True 那麼全部的"bad lines"將會被輸出(只能在C解析器下使用)
  • low_memory: bool 分塊加載到內存, 再低內存消耗中解析, 可是可能出現類型混淆, 確保類型不被混淆須要設置爲False或者使用dtype參數指定類型, 注意使用chunksize或者iterator參數分塊讀入會將整個文件讀入到一個Dataframe, 而忽略類型(只能在C解析器中有效)
  • buffer_lines: int 這個參數將會在將來版本移除, 由於他的值在解析器中不推薦使用(不推薦使用)
  • compact_ints: bool 這個參數將會在將來版本移除(不推薦使用), 若是設置compact_ints=True, 那麼任何有整數類型構成的列將被按照最小的整數類型存儲, 是否有符號將取決於use_unsigned參數
  • use_unsigned: bool 這個參數將會在將來版本移除(不推薦使用), 若是整數列被壓縮(i.e. compact_ints=True), 指定被壓縮的列是有符號仍是無符號的
  • memory_map: bool 若是使用的文件在內存內, 那麼直接map文件使用。使用這種方式能夠避免文件再次進行IO操做
相關文章
相關標籤/搜索