数据处理奇技巧——python数据处理小技能
有人說做數據無非幾點:邏輯思路,技術工具和業務需求,1)邏輯思路中涵蓋的大多是一些算法、規則;
2)技術工具中主要是python、Excel和SQL;
3)業務邏輯里面則多為一些指標、客群等。
看著很多的內容,等處理過了才發現,無他,唯手熟爾~
做數據以來,難免會遇到各種處理方法上的問題,每次遇到問題點就整理一下關鍵的語句,逐漸的,才發現原來整理了一整套,今天抽取一些比較常用的語句,分成了幾篇:
一篇是python的常用語句,
一篇是SQL的常規用法,
整理出來,也希望能給大家一些啟發,后有Excel的內容,估計需要過段時間才能出場了。
這三篇文章不是告訴你一些系統的工具使用方法,而是針對那些經常使用python,但是又記不住數據處理的方法函數的人,做一個小技巧的總結。
希望大家能夠喜歡。
下面先來說一下python的內容:
1、數據讀取和篩選的方法
1)數據讀取:
對應的代碼為:
條件篩選:
data.loc[np.logical_and(data['type_name']>=5, data['type_name']<=8)].groupby('tab_name')或者:
2)讀取前五行:
pandas讀取時限定行數:此方法只將前5行讀入到內存中,所以比較快速。
import pandas as pd data = pd.read_csv('sub_customer.csv',nrows=5)head函數:也是pandas中的用法,不過這個用法需要將大量數據存入到內存中,然后才會讀其中的前5行。
循環讀取前五行方法:最原始的方法,非常耗時。
2、for-in的兩層循環寫法
1)以下會將二維數據輸出成一個二維的數組:
data = [[i for i in j if j!='null'] for j in data]2)以下會將二維數組輸出成一個一維的數組:
data = [i for i in [j for j in data if j !='null']]3、分批讀取文件的方法
1)txt分塊讀取的方法:
import time # https://blog.csdn.net/weixin_43790560/article/details/88587123 def read_in_chunks(filePath, chunk_size=10*10):file_object = open(filePath)time.sleep(2)while True:chunk_data = file_object.read(chunk_size)if not chunk_data:breakyield chunk_data if __name__ == "__main__":path = '/Users/livan/PycharmProjects/data/Page Data/Facebook Insights Data Export - Visit Beijing - 2014-07.xml'for chunk in read_in_chunks(path):print(chunk)2)pandas也有分塊讀取數據的方法:
loop = true chunkSize = 10000 path = '../data/result.csv' reader = pd.read_csv(path, iterator = True, dtype=str) while loop:try:chunk = reader.get_chunk(chunkSize).fillna('nan')except StopIteration:loop = Falseprint('iteration is stopped~')4、pandas技能的交、并、差集
1)第一種處理方法:
交集:
#方法一:
a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print(tmp) #[2, 5]#方法二:
list(set(a).interp(set(b))#方法二比方法一快很多!
并集:
list(set(a).union(set(b)))補集:
list(set(b).difference(set(a)))# b中有而a中沒有的。
2)第二種處理方法:
df1 = pd.DataFrame([['a', 10, '男'],['b', 11, '男'],['c', 11, '女'],['a', 10, '女'],['c', 11, '男']],columns=['name', 'age', 'sex']) df2 = pd.DataFrame([['a', 10, '男'],['b', 11, '女']],columns=['name', 'age', 'sex'])# 取交集:
# 取并集:
print(pd.merge(df1,df2,on=['name', 'age', 'sex'], how='outer'))how參數是連接方式:
how = 'inner'是內連接,即共同列的交集形成結果;
how = 'outer'是外連接,即共同列的并集形成結果;
how='left',dataframe的鏈接方式為左連接,我們可以理解基于左邊位置dataframe的列進行連接,參數on設置連接的共有列名。
how='right',dataframe的鏈接方式為左連接,我們可以理解基于右邊位置dataframe的列進行連接,參數on設置連接的共有列名。
# 取差集(從df1中去掉df2中存在的行):
# 下面需要有兩次賦值追加append,因為一次時是取兩個數據不同時存在的數據。
# 是兩個的合集,但是再添加一次就可以將df2中的數據去除掉,就會得到df1中的獨立存在的數據。
df1 = df1.append(df2) df1 = df1.append(df2) df3 = df1.drop_duplicates(subset=['name', 'age', 'sex'],keep=False)5、pandas中的concat連接
1)增加行拼接:
data = pd.concat([df1, df2])2)增加列拼接:
data = pd.concat([df1, df2], axis=1) data = data.reset_index(drop=True) print(data) dup_data = data['sex'].drop_duplicates() print(dup_data)6、pandas數據去重
1)去重復:
df1.drop_duplicates(subset=['name', 'age', 'sex'])2)簡單方法:
df = pd.read_csv('./demo_duplicate.csv') print(df) print(df['Seqno'].unique()) # [0. 1.]# 使用duplicated 查看重復值
# 參數 keep可以標記重復值 {'first','last',False}
print(df['Seqno'].duplicated()) ''' 0 False 1 True 2 True 3 True 4 False Name: Seqno, dtype: bool '''# 刪除 series 重復數據
print(df['Seqno'].drop_duplicates()) ''' 0 0.0 4 1.0 Name: Seqno, dtype: float64 '''# 刪除 dataframe 重復數據
print(df.drop_duplicates(['Seqno']))# 按照 Seqno 來 去重
# drop_dujplicates() 第二個參數 keep 包含的值有: first、last、False
print(df.drop_duplicates(['Seqno'], keep='last')) # 保存最后一個 '''Price Seqno Symbol time 3 1623.0 0.0 APPL 1473411963 4 1649.0 1.0 APPL 1473411963 '''7、to_csv()中長數據轉化成字符串
to_csv()函數中,如果是長數字,需要在后面添加‘\t’,以保證數字轉化成字符串:
df1 = pd.DataFrame([['a', 10, '男'],['b', 11, '男'],['c', 11, '女'],['a', 10, '女'],['c', 11, '男']],columns=['name', 'age', 'sex']) df1['a'] = [str(i)+'\t' for i in df1['a']]此時再進行to_csv的函數時,長數據就不會變成科學計數法。
8、pandas中增加行列
本文只用了添加功能,因為在處理數據時能不刪除,盡量不做刪除動作,可以通過過濾來取到小的數據集。
1)增加行:at()函數
想增加一行,行名稱為‘5’,內容為[16, 17, 18, 19]
df.loc['5'] = [16, 17, 18, 19] # 后面的序列是Iterable就行 df.at['5'] = [16, 17, 18, 19] df.set_value('5', df.columns, [16, 17, 18, 19], takeable=False) # warning,set_value會被取消2)增加列:Insert()函數
可以指定插入位置,和插入列名稱
df.insert(0, 'E', s)細節可查看文章:
https://www.cnblogs.com/guxh/p/9420610.html9、python常用高階函數
1) lambda函數:匿名函數
數據會以參數的形式完整傳給x,y,而后經過x+y運算循環呈現在x,y中;
add = lambda x, y : x+y add(1,2) # 結果為32) map函數:會根據提供的函數對指定序列做映射
def square(x) : # 計算平方數 return x ** 2 將第二個參數的列表內容逐一放到square函數中,計算出對應的結果; map(square,?[1,2,3,4,5])???#?計算列表各個元素的平方 也可以與lambda函數結合使用: map(lambda?x:?x?**?2,?[1,?2,?3,?4,?5])??#?使用?lambda?匿名函數 map(lambda?x,?y:?x?+?y,?[1,?3,?5,?7,?9],?[2,?4,?6,?8,?10])?#?可以放置多個參數3) reduce函數:是返回第一個數與第二個數做add運算,產生的結果再去add第三個數,以此類推。
def add(x, y) : # 兩數相加 return x + y reduce(add, [1,2,3,4,5])???#?計算列表和:1+2+3+4+5 reduce(lambda?x,?y:?x+y,?[1,2,3,4,5])??#?使用?lambda?匿名函數4) groupby函數:分組處理
幾種常用的用法:
4.1)單列分組,然后按照另一列數據計算相應值:
data.groupby('race')['age'].mean()4.2)多列分組,然后按照另一列數據計算相應值:
Muldf = df.groupby(['Q','A']).agg('mean')4.3)多列分組,然后按照多列分別計算相應值:
data.groupby('race').agg({'age': np.median, 'signs_of_mental_illness': np.mean})4.4)所能對接的函數有很多,效果不同:
data.groupby('flee')['age'].plot(kind='kde',legend=True,figsize=(20, 5))5) agg({'tab1':'mean'})函數:主要是用在groupby后面,對每個分組的數據進行計算,里面內嵌字典,可以進行多字段,不同計算方式的操作;
df.groupby('key').agg({'tab1':'mean'})6) apply(sum)函數:主要用在groupby后面,對每個分組的數據進行計算,功能比agg要多,可以加入自定義的函數;
當apply使用自定義的函數時,自定義函數的參數為整個df,然后再在這個df中確定其他字段的處理方式:
1)apply不帶參數時:
def reduce(dx):dx.sum()??#在apply中函數不需要加(),但是在其他地方調用函數需要加上(),不要搞混了return?dx df.groupby('a').apply(reduce)2)apply帶參數時:
def reduce(dx,k,kk):dx?=?dx*k+kkreturn?dx df.groupby('a').apply(reduce,axis=1,args=(2,1,))其中axis=1為按行計算,即總數據每行調用一次函數;axis=0為按列計算,即總數據每列調用一次函數;
pandas中使用apply()函數第一組值重復的解決方法:
global flag flag = False def test(x):global flagif flag == False:flag = Truereturntssf(x) ==此處添加函數7) filter函數:接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。
8) generator函數:迭代器函數
g = (x * x for x in range(10)) # 注意把[]改成()后,不是生成一個tuple,而是生成一個generator while True:print(g.__next__())迭代器需要考慮的有yield關鍵字:
def foo():print("starting...")while True:res = yield 4print("res:", res) g = foo()運算一次,將結果反饋出來,并且停在yield處:
print(next(g))傳遞新的值到yield處,然后往下運行:
print(g.send(7))9) 三目運算:三目的格式為:條件為真時的結果 if 判段的條件 else 條件為假時的結果
print(x if(x>y) else y)10) np.where:條件篩選語句:
A = np.array([1, 7, 4, 9, 2, 3, 6, 0, 8, 5]) B = np.where(A%2 == 0, A+1, A-1) # 偶+1,奇-1 print(B)10、pandas組內排序問題
數據的組內排序是常用的方法:
細節內容可以參考如下文檔:
https://blog.csdn.net/weixin_43685844/article/details/87913303
11、數據讀寫亂碼和格式修改
1)數據的讀寫亂碼主要有以下兩種方案:
使用 df.to_csv(file_name2, encoding='utf-8') 查看是否還存在編碼問題。
df.to_csv(file_name2,encoding="utf_8")使用 df.to_csv(file_name2, encoding='utf_8_sig') 查看是否問題依然存在。
df.to_csv(file_name3,encoding="utf_8_sig")2)讀取csv文件時轉化成字符串的問題:
df=pd.read_csv('D:/project/python_instruct/test_data2.csv', header=None,dtype='str')3)數據格式修改:
總結
以上是生活随笔為你收集整理的数据处理奇技巧——python数据处理小技能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GitHub:除非真正需要,否则我们不会
- 下一篇: Python3.9又更新了:dict内置