python數據處理小記
- 簡介:
- 1、DataFram定義:
- 2、DataFrame的append
- 3、DataFrame去除列或行
- 4、DataFrame查看數據基本統計情況
- 5、DataFrame的applymap及apply操作
- 6、DataFrame的元素、列、行的獲取
- 7、DataFrame的透視表
- 8、DataFrame空值處理、去重
- 9、DataFrame的數據庫查詢
- 10、DataFrame插入數據庫
- 11、python去除字符串前后指定值
簡介:
目前從事數據版塊的工作,基本就是數倉、ETL、BI這一塊。學習了一個python機器學習課程,在此記下學習過程中遇到的坑。pandas的詳細使用可查: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字典結構
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結構
方法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可以設置索引名稱')
df = df.append(line,ignore_index=False)
print(df)
輸出為:
Empty DataFrame
Columns: [姓名, 年齡, 性別]
Index: []
姓名 年齡 性別
Series可以設置索引名稱 張三 24 男
如果是append字典,則ignore_index必須為True,如果是append Series結構,則可以設置ignore_index為False,然后設置特定的索引。
3、DataFrame去除列或行
去除列:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
#inplace如果設置為False,則不會替換原有對象
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變量,若要替換則設置為True,columns和index可以通過列表結構或字符串來定位需要刪除的列和行。
行刪除的方法二:
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df)
#isin是獲取所有姓名為['張三']的行數據,~是取反的意思。
df = df[~df['姓名'].isin(['張三'])]
print(df)
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
姓名 年齡 性別
乙 李四 24 女
丙 王五 35 男
4、DataFrame查看數據基本統計情況
查看統計詳情:
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方法可以看到數據里面數值類型的基本統計情況。
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的標記為年輕,大于等于30的標記為中年,大于等于60標記為老年
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是向方法中傳入每一個元素,然后方法返回結果。applymap沒有inplace參數,如果要覆蓋原對象,需要進行重新賦值操作。
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是想方法里面傳入一列或者一行進行運算,axis=0是傳入一列,axis=1則傳入一行,默認為0。
6、DataFrame的元素、列、行的獲取
import pandas as pd
df = pd.DataFrame([['張三',23,'男'],['李四',24,'女'],['王五',35,'男']],columns=['姓名','年齡','性別'],index=['甲','乙','丙'])
print(df,'\n')
print('DataFrame后面緊接[],則可以獲取對應列數據')
print(df['姓名'],'\n')
print('DataFrame后面緊接[][],第一個為列名,第二個為行名')
print(df['姓名']['甲'],'\n')
print('DataFrame的iloc里面對應的是行的默認索引,0代表第一行,1代表第二行,如此類推')
print(df.iloc[0],'\n')
print('DataFrame的loc里面對應的行名')
print(df.loc['甲'],'\n')
print('獲取列后,也是可以通過iloc和loc來獲取行數據的')
print(df['姓名'].iloc[2])
print(df['姓名'].loc['丙'],'\n')
print('iat可以通過列和行的默認索引來定位數據')
print(df.iat[0,0],'\n')
輸出為:
姓名 年齡 性別
甲 張三 23 男
乙 李四 24 女
丙 王五 35 男
DataFrame后面緊接[],則可以獲取對應列數據
甲 張三
乙 李四
丙 王五
Name: 姓名, dtype: object
DataFrame后面緊接[][],第一個為列名,第二個為行名
張三
DataFrame的iloc里面對應的是行的默認索引,0代表第一行,1代表第二行,如此類推
姓名 張三
年齡 23
性別 男
Name: 甲, dtype: object
DataFrame的loc里面對應的行名
姓名 張三
年齡 23
性別 男
Name: 甲, dtype: object
獲取列后,也是可以通過iloc和loc來獲取行數據的
王五
王五
iat可以通過列和行的默認索引來定位數據
張三
7、DataFrame的透視表
方法為pivot_table:
import pandas as pd
import numpy as np
df = pd.DataFrame([ ['張三','語文',98.],
['張三','體育',60.],
['李四','數學',60.],
['李四','語文',100.],
['王五','數學',89],
['王五','體育',98.] ],
columns=['name','course','score'])
print(df.pivot_table('score',index='name',columns='course',aggfunc=np.sum,margins=True,fill_value=0))
輸出為:
course 體育 數學 語文 All
name
張三 60 0 98 158.0
李四 0 60 100 160.0
王五 98 89 0 187.0
All 158 149 198 505.0
參數說明:
data: 創建透視表的dataframe
values: 要聚合的值, optional
index: 要聚合的index
columns: 要聚合的columns
aggfunc:聚合的方式, default numpy.mean
fill_value: 用來替換透視表的缺失值scalar, default None
margins: 添加所有行,列,例如在后面加個“總和”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))
#取對應列的上一行數據
print(df.ffill())
#取對應列的下一行數據
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
多有的空值補充函數都不會覆蓋原來對象,需要設置inplace=True參數才能覆蓋。
去重:
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的數據庫查詢
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
參數詳情:
sql : 要執行的SQL查詢。
con : SQLAlchemy可連接(引擎/連接)或數據庫字符串URI或DBAPI2連接(后備模式)使用SQLAlchemy可以使用該庫支持的任何數據庫。如果是DBAPI2對象,則僅支持sqlite3。
index_col : 字符串或字符串列表,可選,默認值:無。要設置為索引的列(MultiIndex)。
coerce_float : boolean,默認為True
嘗試將非字符串,非數字對象(如decimal.Decimal)的值轉換為浮點,這對SQL結果集很有用。
params : list,tuple或dict,optional,默認值:None
要傳遞給執行方法的參數列表。用于傳遞參數的語法取決于數據庫驅動程序。檢查數據庫驅動程序文檔,了解支持PEP 249的paramstyle中描述的五種語法樣式。例如。對于psycopg2,使用%(name)s所以使用params = {‘name’:‘value’}
parse_dates : list或dict,默認值:None
要解析為日期的列名列表。
在解析字符串時間時格式字符串與strftime兼容的位置的字典,或者在解析整數時間戳的情況下是(D,s,ns,ms,us)之一。{column_name: format string}
dict of ,其中arg dict對應于關鍵字參數。 特別適用于沒有本機Datetime支持的數據庫,例如SQLite。{column_name: arg dict}pandas.to_datetime()
columns : list,默認值:None
從SQL表中選擇的列名列表(僅在讀取表時使用)。
chunksize : int,默認無
如果指定,則返回一個迭代器,其中chunksize是要包含在每個塊中的行數。
10、DataFrame插入數據庫
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','瀧澤蘿拉','島國']],columns=['no','name','SYSTEM_SOURCE'])
#第一個參數為DataFrame格式的數據,第二個參數為表名,第三個參數為數據庫連接,第四個為庫名,第五個即存在相同的重復插入。這里的set_index是將no設置為索引列,如果不這樣設置,它會默認的插入多一列index的索引列,因為數據庫表是沒有這一列的,這樣會導致報錯。
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默認是去除空格,可以指定值進行去除。
未完待續,有空更新。。。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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