python數(shù)據(jù)處理小記
- 簡(jiǎn)介:
- 1、DataFram定義:
- 2、DataFrame的append
- 3、DataFrame去除列或行
- 4、DataFrame查看數(shù)據(jù)基本統(tǒng)計(jì)情況
- 5、DataFrame的applymap及apply操作
- 6、DataFrame的元素、列、行的獲取
- 7、DataFrame的透視表
- 8、DataFrame空值處理、去重
- 9、DataFrame的數(shù)據(jù)庫(kù)查詢
- 10、DataFrame插入數(shù)據(jù)庫(kù)
- 11、python去除字符串前后指定值
簡(jiǎn)介:
目前從事數(shù)據(jù)版塊的工作,基本就是數(shù)倉(cāng)、ETL、BI這一塊。學(xué)習(xí)了一個(gè)python機(jī)器學(xué)習(xí)課程,在此記下學(xué)習(xí)過(guò)程中遇到的坑。pandas的詳細(xì)使用可查:http://pandas.pydata.org/pandas-docs/stable/index.html
1、DataFram定義:
只定義列名
import pandas as pd
df = pd.DataFrame(columns=['姓名','年齡','性別'])
print(df)
輸出為:
Empty DataFrame
Columns: [姓名, 年齡, 性別]
Index: []
列名及索引(行名)都定義:
import pandas as pd
df = pd.DataFrame(columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
輸出為:
姓名 年齡 性別
甲 NaN NaN NaN
乙 NaN NaN NaN
丙 NaN NaN NaN
定義加上值:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
2、DataFrame的append
append字典結(jié)構(gòu)
import pandas as pd
df = pd.DataFrame(columns=['姓名','年齡','性別'])
print(df)
line = {'姓名':'張三','年齡':24,'性別':'男'}
df = df.append(line,ignore_index=True)
print(df)
輸出為:
Empty DataFrame
Columns: [姓名, 年齡, 性別]
Index: []
姓名 年齡 性別
0 張三 24 男
append Series結(jié)構(gòu)
方法1:
import pandas as pd
df = pd.DataFrame(columns=['姓名','年齡','性別'])
print(df)
line = pd.Series({'姓名':'張三','年齡':24,'性別':'男'})
df = df.append(line,ignore_index=True)
print(df)
輸出為:
Empty DataFrame
Columns: [姓名, 年齡, 性別]
Index: []
姓名 年齡 性別
0 張三 24 男
方法2:
import pandas as pd
df = pd.DataFrame(columns=['姓名','年齡','性別'])
print(df)
line = pd.Series({'姓名':'張三','年齡':24,'性別':'男'},name='Series可以設(shè)置索引名稱')
df = df.append(line,ignore_index=False)
print(df)
輸出為:
Empty DataFrame
Columns: [姓名, 年齡, 性別]
Index: []
姓名 年齡 性別
Series可以設(shè)置索引名稱 張三 24 男
如果是append字典,則ignore_index必須為True,如果是append Series結(jié)構(gòu),則可以設(shè)置ignore_index為False,然后設(shè)置特定的索引。
3、DataFrame去除列或行
去除列:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
#inplace如果設(shè)置為False,則不會(huì)替換原有對(duì)象
df.drop(columns=['姓名','年齡'],inplace=False)
print(df)
#列刪除
df.drop(columns=['姓名','年齡'],inplace=True)
print(df)
#行刪除
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
df.drop(index='甲',inplace=True)
print(df)
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
性別
甲 男
乙 女
丙 男
姓名 年齡 性別
乙 李四 24 女
丙 王五 35 男
drop方法,需要留意inplace變量,若要替換則設(shè)置為True,columns和index可以通過(guò)列表結(jié)構(gòu)或字符串來(lái)定位需要?jiǎng)h除的列和行。
行刪除的方法二:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
#isin是獲取所有姓名為['張三']的行數(shù)據(jù),~是取反的意思。
df = df[~df['姓名'].isin(['張三'])]
print(df)
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
姓名 年齡 性別
乙 李四 24 女
丙 王五 35 男
4、DataFrame查看數(shù)據(jù)基本統(tǒng)計(jì)情況
查看統(tǒng)計(jì)詳情:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
print(df.describe())
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
年齡
count 3.000000
mean 27.333333
std 6.658328
min 23.000000
25% 23.500000
50% 24.000000
75% 29.500000
max 35.000000
describe方法可以看到數(shù)據(jù)里面數(shù)值類型的基本統(tǒng)計(jì)情況。
5、DataFrame的applymap及apply操作
applymap操作:
import pandas as pd
df = pd.DataFrame([4,13,5,38,28,59,24,79],columns=['年齡'])
def testApplyMap(age):
#小于30的標(biāo)記為年輕,大于等于30的標(biāo)記為中年,大于等于60標(biāo)記為老年
return '老年' if age >= 60 else ('中年' if age >= 30 else '年輕')
print(df)
print(df.applymap(testApplyMap))
print(df)
df = df.applymap(testApplyMap)
print(df)
輸出為:
年齡
0 4
1 13
2 5
3 38
4 28
5 59
6 24
7 79
年齡
0 年輕
1 年輕
2 年輕
3 中年
4 年輕
5 中年
6 年輕
7 老年
年齡
0 4
1 13
2 5
3 38
4 28
5 59
6 24
7 79
年齡
0 年輕
1 年輕
2 年輕
3 中年
4 年輕
5 中年
6 年輕
7 老年
applymap是向方法中傳入每一個(gè)元素,然后方法返回結(jié)果。applymap沒(méi)有inplace參數(shù),如果要覆蓋原對(duì)象,需要進(jìn)行重新賦值操作。
apply操作:
import pandas as pd
df = pd.DataFrame({
's1': [27.93, 58.08, 38.67, 45.83, 70.26, 46.61, 49.73, 34.02, 56.64, 57.28],
's2': [28.18, 50.61, 31.73, 31.48, 55.96, 22.73, 40.47, 42.02, 31.39, 64.21],
's3': [29.39, 51.62, 57.91, 45.94, 53.81, 45.77, 69.13, 28.75, 43.43, 55.7],
's4': [40.52, 48.55, 59.24, 71.21, 58.48, 63.63, 55.16, 34.9, 54, 68.03],
's5': [26.26, 54.03, 49.08, 46.53, 43.23, 56.79, 58.71, 26.43, 44.97, 54.16]
}, index = ['05-21', '05-22', '05-23', '05-24', '05-25', '05-26', '05-27', '05-28', '05-29', '05-30'])
def testApply(sale):
return max(sale)
print(df)
print(df.apply(testApply))
print(df.apply(testApply,axis=1))
print(df)
輸出為:
s1 s2 s3 s4 s5
05-21 27.93 28.18 29.39 40.52 26.26
05-22 58.08 50.61 51.62 48.55 54.03
05-23 38.67 31.73 57.91 59.24 49.08
05-24 45.83 31.48 45.94 71.21 46.53
05-25 70.26 55.96 53.81 58.48 43.23
05-26 46.61 22.73 45.77 63.63 56.79
05-27 49.73 40.47 69.13 55.16 58.71
05-28 34.02 42.02 28.75 34.90 26.43
05-29 56.64 31.39 43.43 54.00 44.97
05-30 57.28 64.21 55.70 68.03 54.16
s1 70.26
s2 64.21
s3 69.13
s4 71.21
s5 58.71
dtype: float64
05-21 40.52
05-22 58.08
05-23 59.24
05-24 71.21
05-25 70.26
05-26 63.63
05-27 69.13
05-28 42.02
05-29 56.64
05-30 68.03
dtype: float64
s1 s2 s3 s4 s5
05-21 27.93 28.18 29.39 40.52 26.26
05-22 58.08 50.61 51.62 48.55 54.03
05-23 38.67 31.73 57.91 59.24 49.08
05-24 45.83 31.48 45.94 71.21 46.53
05-25 70.26 55.96 53.81 58.48 43.23
05-26 46.61 22.73 45.77 63.63 56.79
05-27 49.73 40.47 69.13 55.16 58.71
05-28 34.02 42.02 28.75 34.90 26.43
05-29 56.64 31.39 43.43 54.00 44.97
05-30 57.28 64.21 55.70 68.03 54.16
apply是想方法里面?zhèn)魅胍涣谢蛘咭恍羞M(jìn)行運(yùn)算,axis=0是傳入一列,axis=1則傳入一行,默認(rèn)為0。
6、DataFrame的元素、列、行的獲取
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df,'\n')
print('DataFrame后面緊接[],則可以獲取對(duì)應(yīng)列數(shù)據(jù)')
print(df['姓名'],'\n')
print('DataFrame后面緊接[][],第一個(gè)為列名,第二個(gè)為行名')
print(df['姓名']['甲'],'\n')
print('DataFrame的iloc里面對(duì)應(yīng)的是行的默認(rèn)索引,0代表第一行,1代表第二行,如此類推')
print(df.iloc[0],'\n')
print('DataFrame的loc里面對(duì)應(yīng)的行名')
print(df.loc['甲'],'\n')
print('獲取列后,也是可以通過(guò)iloc和loc來(lái)獲取行數(shù)據(jù)的')
print(df['姓名'].iloc[2])
print(df['姓名'].loc['丙'],'\n')
print('iat可以通過(guò)列和行的默認(rèn)索引來(lái)定位數(shù)據(jù)')
print(df.iat[0,0],'\n')
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
DataFrame后面緊接[],則可以獲取對(duì)應(yīng)列數(shù)據(jù)
甲 張三
乙 李四
丙 王五
Name: 姓名, dtype: object
DataFrame后面緊接[][],第一個(gè)為列名,第二個(gè)為行名
張三
DataFrame的iloc里面對(duì)應(yīng)的是行的默認(rèn)索引,0代表第一行,1代表第二行,如此類推
姓名 張三
年齡 23
性別 男
Name: 甲, dtype: object
DataFrame的loc里面對(duì)應(yīng)的行名
姓名 張三
年齡 23
性別 男
Name: 甲, dtype: object
獲取列后,也是可以通過(guò)iloc和loc來(lái)獲取行數(shù)據(jù)的
王五
王五
iat可以通過(guò)列和行的默認(rèn)索引來(lái)定位數(shù)據(jù)
張三
7、DataFrame的透視表
方法為pivot_table:
import pandas as pd
import numpy as np
df = pd.DataFrame([ ['張三','語(yǔ)文',98.],
['張三','體育',60.],
['李四','數(shù)學(xué)',60.],
['李四','語(yǔ)文',100.],
['王五','數(shù)學(xué)',89],
['王五','體育',98.] ],
columns=['name','course','score'])
print(df.pivot_table('score',index='name',columns='course',aggfunc=np.sum,margins=True,fill_value=0))
輸出為:
course 體育 數(shù)學(xué) 語(yǔ)文 All
name
張三 60 0 98 158.0
李四 0 60 100 160.0
王五 98 89 0 187.0
All 158 149 198 505.0
參數(shù)說(shuō)明:
data: 創(chuàng)建透視表的dataframe
values: 要聚合的值, optional
index: 要聚合的index
columns: 要聚合的columns
aggfunc:聚合的方式, default numpy.mean
fill_value: 用來(lái)替換透視表的缺失值scalar, default None
margins: 添加所有行,列,例如在后面加個(gè)“總和”boolean, default False
dropna: 不要包含條目都是NaN的列boolean, default True
margins_name: 行列名稱, default ‘All’
8、DataFrame空值處理、去重
空值處理:
import pandas as pd
df = pd.DataFrame([23,3,13,None,5],columns=['年齡'])
print(df,'\n')
#指定填充的值
print(df.fillna(0))
#取對(duì)應(yīng)列的上一行數(shù)據(jù)
print(df.ffill())
#取對(duì)應(yīng)列的下一行數(shù)據(jù)
print(df.bfill())
輸出為:
年齡
0 23.0
1 3.0
2 13.0
3 NaN
4 5.0
年齡
0 23.0
1 3.0
2 13.0
3 0.0
4 5.0
年齡
0 23.0
1 3.0
2 13.0
3 13.0
4 5.0
年齡
0 23.0
1 3.0
2 13.0
3 5.0
4 5.0
多有的空值補(bǔ)充函數(shù)都不會(huì)覆蓋原來(lái)對(duì)象,需要設(shè)置inplace=True參數(shù)才能覆蓋。
去重:
import pandas as pd
df = pd.DataFrame([23,3,3,13,None,5],columns=['年齡'])
print(df,'\n')
print(df.drop_duplicates())
print(df)
df.drop_duplicates(inplace=True)
print(df)
輸出為:
年齡
0 23.0
1 3.0
2 3.0
3 13.0
4 NaN
5 5.0
年齡
0 23.0
1 3.0
3 13.0
4 NaN
5 5.0
年齡
0 23.0
1 3.0
2 3.0
3 13.0
4 NaN
5 5.0
年齡
0 23.0
1 3.0
3 13.0
4 NaN
5 5.0
9、DataFrame的數(shù)據(jù)庫(kù)查詢
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8")
#SQL查詢
def query(sql,engine):
return pd.read_sql(sql, engine, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)
df = query('select * from a limit 1',engine)
print(type(df))
print(df)
輸出為:
id no name SYSTEM_SOURCE
0 1 1 哈哈 Z
參數(shù)詳情:
sql : 要執(zhí)行的SQL查詢。
con : SQLAlchemy可連接(引擎/連接)或數(shù)據(jù)庫(kù)字符串URI或DBAPI2連接(后備模式)使用SQLAlchemy可以使用該庫(kù)支持的任何數(shù)據(jù)庫(kù)。如果是DBAPI2對(duì)象,則僅支持sqlite3。
index_col : 字符串或字符串列表,可選,默認(rèn)值:無(wú)。要設(shè)置為索引的列(MultiIndex)。
coerce_float : boolean,默認(rèn)為True
嘗試將非字符串,非數(shù)字對(duì)象(如decimal.Decimal)的值轉(zhuǎn)換為浮點(diǎn),這對(duì)SQL結(jié)果集很有用。
params : list,tuple或dict,optional,默認(rèn)值:None
要傳遞給執(zhí)行方法的參數(shù)列表。用于傳遞參數(shù)的語(yǔ)法取決于數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。檢查數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序文檔,了解支持PEP 249的paramstyle中描述的五種語(yǔ)法樣式。例如。對(duì)于psycopg2,使用%(name)s所以使用params = {‘name’:‘value’}
parse_dates : list或dict,默認(rèn)值:None
要解析為日期的列名列表。
在解析字符串時(shí)間時(shí)格式字符串與strftime兼容的位置的字典,或者在解析整數(shù)時(shí)間戳的情況下是(D,s,ns,ms,us)之一。{column_name: format string}
dict of ,其中arg dict對(duì)應(yīng)于關(guān)鍵字參數(shù)。 特別適用于沒(méi)有本機(jī)Datetime支持的數(shù)據(jù)庫(kù),例如SQLite。{column_name: arg dict}pandas.to_datetime()
columns : list,默認(rèn)值:None
從SQL表中選擇的列名列表(僅在讀取表時(shí)使用)。
chunksize : int,默認(rèn)無(wú)
如果指定,則返回一個(gè)迭代器,其中chunksize是要包含在每個(gè)塊中的行數(shù)。
10、DataFrame插入數(shù)據(jù)庫(kù)
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8")
df = pd.DataFrame([['5','瀧澤蘿拉','島國(guó)']],columns=['no','name','SYSTEM_SOURCE'])
#第一個(gè)參數(shù)為DataFrame格式的數(shù)據(jù),第二個(gè)參數(shù)為表名,第三個(gè)參數(shù)為數(shù)據(jù)庫(kù)連接,第四個(gè)為庫(kù)名,第五個(gè)即存在相同的重復(fù)插入。這里的set_index是將no設(shè)置為索引列,如果不這樣設(shè)置,它會(huì)默認(rèn)的插入多一列index的索引列,因?yàn)閿?shù)據(jù)庫(kù)表是沒(méi)有這一列的,這樣會(huì)導(dǎo)致報(bào)錯(cuò)。
pd.io.sql.to_sql(df.set_index('no'),'a',engine,schema='test',if_exists='append')
11、python去除字符串前后指定值
去空格:
import pandas as pd
s = ' sskc ufss '
s = s.strip()
print(s)
s = s.lstrip('s')
print(s)
s = s.rstrip('s')
print(s)
輸出為:
sskc ufss
kc ufss
kc uf
strip、lstrip、rstrip默認(rèn)是去除空格,可以指定值進(jìn)行去除。
未完待續(xù),有空更新。。。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
