數據處理奇技巧——python篇

1、數據讀取前五行方法:

1)pandas讀取時限定行數:此方法只將前5行讀入到內存中,所以比較快速。

import pandas as pd

data = pd.read_csv('sub_customer.csv',nrows=5)

2)head函數:也是pandas中的用法,不過這個用法需要將大量數據存入到內存中,然後纔會讀其中的前5行。

import pandas as pd

data = pd.read_csv('sub_customer.csv')

data.head(5)

3)循環讀取前五行方法:最原始的方法,非常耗時。

N = int(raw_input('Enter a line number : >> '))

Filename = raw_input('Enter a file path: >> ')

file = open(Filename,'r')

lineNum = 0

for line in file.readlines()[0:N]:

    print line

file.close()

2、for-in的兩層循環方法:

以下會將二維數據輸出成一個二維的數組:

data = [[i for i in j if j!='null'] for j in data]

以下會將二維數組輸出成一個一維的數組:

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:

break

yield 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 = False

print('iteration is stopped~')

4、pandas中dataframe的集合運算:交集、並集、差集,左右連接~

第一種處理方法:

交集:

#方法一: 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).intersection(set(b))

#方法二比方法一快很多!

並集:

list(set(a).union(set(b)))

補集:

list(set(b).difference(set(a))) # b中有而a中沒有的

第二種處理方法:

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']))

# 取並集:

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拼接:

# 增加行拼接:

data = pd.concat([df1, df2])

# 增加列拼接:

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數據去重:unique、drop_duplicates的函數:

# 去重複:

df1.drop_duplicates(subset=['name', 'age', 'sex'])

# 簡單方法:

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 來 去重

'''

Price Seqno Symbol time

0 1623.0 0.0 APPL 1473411962

4 1649.0 1.0 APPL 1473411963

'''

# 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()函數中,如果是長數字,需要在後面添加‘\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中增加、刪除行和列:

2)增加列:Insert()

函數可以指定插入位置,和插入列名稱

https://www.cnblogs.com/guxh/p/9420610.html

9、常用函數:

1) lambda函數:匿名函數

數據會以參數的形式完整傳給x,y,而後經過x+y運算循環呈現在x,y中;

add = lambda x, y : x+y add(1,2) # 結果爲3

2) 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要多,可以加入自定義的函數;

df.groupby('key').apply(lamdba x: x['v'].sum())

df.groupby('key').apply(sum)

當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+kk

return 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 flag if flag == False: flag = True return tssf(x) ==此處添加函數

7) filter函數:接收兩個參數,第一個爲函數,第二個爲序列,序列的每個元素作爲參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。

def is_odd(n): return n % 2 == 1

將[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]中的數據逐一傳入is_odd中做運算,過濾結果存入tmplist tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) newlist = list(tmplist) print(newlist)

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 4

print("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取數據:

df[['tab1','tab2','tab3']] # 取某一列或者某幾列

df[df['size_num']>22.0] #單條件篩選 df[(df['size_num']>22.0) & (df['size_num]<50)] #多條件篩選

# 如果你想包括多個值,把它們放在一個list裏面,然後使用isin print(df.loc[df['B'].isin(['one','three'])])

print(data.loc[1, :]) # 取一行數據;

print(pd.loc[3:6]) # 類似於python的切片操作,取3:6行

print(data.loc[:, ['a', 'b']]) # 取一列值;

print(data.loc[1, ['a', 'b']]) # 取某行某列值;

print(data.iloc[1, :]) # 取一行數據;

print(data.iloc[:, 1]) # 取一列數據;

條件篩選:

data.loc[np.logical_and(data['type_name']>=5, data['type_name']<=8)].groupby('tab_name')

或者:

data[(data['type_name']>=5)&( data['type_name']<=8)] :注意此處一定要用符號&進行連接;

pandas插入一列:pd.insert(1, 'a', value='')

11、pandas組內排序問題:

data['ranks'] = data['act_timestamp'].groupby(data['session_id']).rank()

data = data.sort_values(by=['session_id','ranks'], ascending=[True, True])

data['act_timestamp'].groupby(data['session_id'])是一個迭代器,可以根據循環遍歷處對應的值;

for group in data.groupby(data['session_id']):

print(group)

https://blog.csdn.net/weixin_43685844/article/details/87913303

11、數據生成到csv文件的亂碼問題:

主要有以下兩種方案:

1)使用 df.to_csv(file_name2, encoding='utf-8') 查看是否還存在編碼問題。

df.to_csv(file_name2,encoding="utf_8")

2)使用 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')

12、數據格式修改:

df[['two', 'three']] = df[['two', 'three']].astype(float)

發佈了139 篇原創文章 · 獲贊 96 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章