亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python數據處理DataFrame小記

系統 1899 0

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

            
          

Python數據處理DataFrame小記_第1張圖片

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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩欧美亚洲一区 | 九九资源站 | 天天曰天天操 | 国产综合图片 | 精品综合一区二区三区 | 青青热久久国产久精品秒播 | 三极毛片| 999在线视频 | 欧美三级中文字幕 | 中文精品视频一区二区在线观看 | 911精品国产亚洲日本美国韩国 | 久久综合九色综合亚洲小说 | 天天舔天天射天天操 | 亚洲欧美人成综合在线最新 | 日韩欧美色视频 | 久久日精品 | 日日操夜夜爽 | 老子影院午夜理伦手机不卡 | 成人永久福利在线观看不卡 | 欧美在线视频7777kkkk | 亚洲一区二区三区香蕉 | 神马影院888不卡院 神马影院不卡不卡在线观看 | 在线国产欧美 | www.国产福利视频.com | 成人免费视频国产 | 乱子伦有声小说mp3 仑乱高清在线一级播放 | 一级aaaaaa毛片免费 | 国产普通话自拍 | 久草在线资源 | 呦呦国产| 狠狠色综合久久婷婷 | 四虎影视永久在线观看 | 欧美精品另类 | 色悠综合 | 欧美巨大xxxx做受孕妇视频 | 九九久久国产精品 | 97影院午夜午夜伦不卡 | 精品日产一区二区三区手机 | 国产日韩欧美成人 | 欧美一级α片毛片免费观看 | 久久99久久99精品免观看 |