Pandas數(shù)據(jù)科學(xué)庫學(xué)習(xí)總結(jié)

Pandas簡介

Pandas是python數(shù)據(jù)分析中一個非常核心的數(shù)據(jù)庫, 在日常的工作中經(jīng)常需要使用Pandas庫來對數(shù)據(jù)進行處理分析。Pandas的核心為兩大數(shù)據(jù)結(jié)構(gòu), SeriesDataFrame,Series用于存儲一維數(shù)據(jù), 而DataFrame存儲多維數(shù)據(jù)。


常用的軟件

Anaconda是數(shù)據(jù)分析中運行python的一款利器, 安裝教程可參考
Anaconda入門使用指南


Series對象

Series用于存儲一維數(shù)據(jù),由兩個相互關(guān)聯(lián)的數(shù)組組成, 主數(shù)組用來存放數(shù)據(jù)。主數(shù)據(jù)每個元素都有一個與之關(guān)聯(lián)的標簽,這些標簽存儲在另一個叫Index的數(shù)組中。

Series
  1. 創(chuàng)建Series對象
zy = pd.Series([2, 3, 4, 6, 7, 4], index = ['a', 'b', 'c', 'd', 'e', 'f'])
  1. 查看Series對象的兩個數(shù)組
# 查看元素
zy.values

# 查看索引
zy.index
  1. 查看元素
# 將zy看做Numpy數(shù)組,智定鍵
zy[2]
zy[0:2]

# 指定標簽
zy['c']
zy[['b', 'c']]

  1. 篩選元素
zy[zy >3]
  1. 查看組成元素
# 查看包含的不同元素
zy.unique()
zy.value_counts()
  1. 通過字典來創(chuàng)建
zy=Series({'a':1,'b':2,'c':3})

DataFrame對象

DataFrame

讀取與寫入Excel數(shù)據(jù)

  1. 讀取文件夾的內(nèi)容
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
import os


file_list = os.listdir(r'E:\工作文件\周報\周數(shù)據(jù)\測試\0902-0908')
print(file_list, '\t')
  1. 讀取xls格式Excel表
df = pd.read_excel('E:/工作文件/周報/周數(shù)據(jù)/測試/0902-0908/an-商品匯總-uv.xls')
df = pd.read_excel(r'E:\工作文件\周報\周數(shù)據(jù)\測試\0902-0908\an-商品匯總-uv.xls')

  1. 讀取csv格式Excel表
df = pd.read_csv('E:/工作文件/周報/周數(shù)據(jù)/測試/0902-0908/商品匯總.scsv')
  1. 讀取txt格式數(shù)據(jù)
df = pd.read_table(r'C:\Users\Administrator\Desktop\haha.txt')

with open(r'C:\Users\Administrator\Desktop\haha.txt', 'r') as f:
    df = f.readlines() 

df = np.loadtxt(r'C:\Users\Administrator\Desktop\haha.txt')  # 將txt文件存為numpy數(shù)組
  1. 將數(shù)據(jù)寫入Excel表, 并輸出
data.to_excel('C:/Users/Administrator/Desktop/'+'商品分類.xlsx')
data.to_excel(r'C:\Users\Administrator\Desktop\\'+'商品分類.xlsx')
data.to_excel(r'C:\Users\Administrator\Desktop/'+'商品分類.xlsx')
  1. 其他數(shù)據(jù)格式
# 從SQL表/庫導(dǎo)入數(shù)據(jù) 
pd.read_sql(query, connection_object)

# 從JSON格式的字符串導(dǎo)入數(shù)據(jù) 
pd.read_json(json_string)

# 解析URL、字符串或者HTML文件,抽取其中的tables表格 
pd.read_html(url)

# 從你的粘貼板獲取內(nèi)容,并傳給read_table() 
pd.read_clipboard()

# 從字典對象導(dǎo)入數(shù)據(jù),Key是列名,Value是數(shù)據(jù)
pd.DataFrame(dict)

# 導(dǎo)出數(shù)據(jù)到SQL表 
df.to_sql(table_name, connection_object)

# 以Json格式導(dǎo)出數(shù)據(jù)到文本文件
df.to_json(filename)

描述數(shù)據(jù)

  1. 表信息
df.info()
  1. 顯示數(shù)據(jù)的行列數(shù)
df.shape
  1. 查看數(shù)據(jù)格式dtpyes
df.dtypes
  1. 顯示列名、元素
df.columns
df.values

  1. 添加默認列名
# 如果數(shù)據(jù)沒有標題行,可用pandas添加默認的列名
df = pd.read_excel('x.xlsx', header = None) 
  1. 顯示前數(shù)據(jù)前5行
df.head(5)
df[['標題', '客戶端uv']].head()
  1. 顯示數(shù)據(jù)后5行
df.tail(5)
df.values
  1. 讀取a列
df['a']
  1. 修改索引
df = df.set_index['標題']
  1. 顯示數(shù)據(jù)唯一值(unique函數(shù))
# 數(shù)據(jù)有0, 是因?qū)θ笔е颠M行了填充
df['經(jīng)紀人級別'].unique()
  1. 對第幾行數(shù)據(jù)不讀取
#不讀取哪里數(shù)據(jù),可用skiprows=[i],跳過文件的第i行不讀取
df = pd.read_excel('x.xlsx',skiprows=[2] ) 
  1. 對缺失值進行識別
# 所有缺失值顯示為True
pd.insull(df)  # df.isnull()
  1. 計算
#計算此data的數(shù)量
df['data'].value_counts()

# 升序計數(shù)
df['data'].value_counts(ascending = True)

# 升序計數(shù)并分組
df['data'].value_counts(ascending = True, bins = 2)

# 計數(shù)
df['data'].count()

數(shù)據(jù)清洗

  1. 刪除空值 (dropna函數(shù))
df.dropna(how='any')
  1. 填充空值(fillna函數(shù))
# 空值用0填充
df.fillna(value=0)

# 用均值對空值進行填充
df['經(jīng)紀人響應(yīng)時長'].fillna(df['經(jīng)紀人響應(yīng)時長'].mean())
  1. 更改數(shù)據(jù)格式
# 將數(shù)據(jù)格式int64,改為float格式
df['大區(qū)'].astype('float64')
  1. 更改列名稱
df.rename(columns={'IM渠道': '渠道'})
  1. 找到重復(fù)值
df.duplicated()
  1. 刪除重復(fù)值
# 默認第一次出現(xiàn)的保留,其余刪除
df['門店'].drop_duplicates()

最后一次出現(xiàn)的保留,其余刪除
df['門店'].drop_duplicates(keep = 'last')

  1. 對列表內(nèi)的值進行替換
df['客戶UCID'].replace('10531975', '110')
  1. 找出異常值
print(data.describe())
# 對異常值進行刪除

  1. 修改數(shù)據(jù)

# 修改結(jié)果
df.replace(參數(shù))

# 修改索引
df.rename(參數(shù))

# 增加
df.append(參數(shù))

# 刪除
def df['a']

df.drop(['a', 'b'], inplace = True)



對數(shù)據(jù)進行處理

  1. 對兩個數(shù)據(jù)進行合并- mearge, join, concat函數(shù)
# 按照軸把多個對象拼接起來
pd.concat(df1, df2)

# join函數(shù)適合根據(jù)索引進行合并,合并索引相同但列不同的對象

# merge函數(shù),根據(jù)一個或多個鍵連接多行

left = pd.DataFrame({'key':['ko','k1','k2','k3'],
                     'key2' : ['ko','k1','k2','k3'],
                     'A' :['ao','a1','a2','a3' ],
                     'B' : ['bo','b1','b2','b3' ]})

right =pd.DataFrame({'key':['ko','k1','k2','k3'],
                     'key2' : ['ko','k1','k2','k4'],
                     'c' :['co','c1','c2','c3' ],
                     'd' : ['do','d1','d2','d3' ]})

# 將left和right進行合并
pd.merge(left, right)

# 指定以key為鍵進行合并
pd.merge(left, right, on = 'key')

# key2列不相同的部分會直接舍棄掉
pd.merge(left, right, on = ['key', 'key2'])

# 保留key2列不相同的部分
pd.merge(left, right, on = ['key', 'key2'], how = 'outer')

# 不相同的部分指定以左表為基準
pd.merge(left, right, on = ['key', 'key2'], how = 'left')

  1. 對數(shù)據(jù)進行排序
data =pd.DataFrame({ 'group':['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd', 'a'],
                  'data' : [4, 2, 5, 6, 7, 8, 2, 9, 4]})

# 在保證group列降序的情況下,對data列進行升序處理
data.sort_values(by = ['group', 'data'],ascending = [False, True], inplace = True)

  1. 對數(shù)據(jù)進行分組——excel中的數(shù)據(jù)透視表
# 如果price列的值>3000,group列顯示high,否則顯示low

df['group'] = np.where(df['客戶當(dāng)天發(fā)送消息數(shù)'] > 5,'high','low')


# 對符合多個條件進行分組
# 符合經(jīng)紀人級別為A1且經(jīng)紀人響應(yīng)時長>24的在sign列顯示為1

df.loc[(df['經(jīng)紀人級別'] == 'A1') & (df['經(jīng)紀人響應(yīng)時長']>= 24.0), 'sign']=1

  1. 對數(shù)據(jù)進行分列
pd.DataFrame((x.split('網(wǎng)') for x in df['客戶注冊渠道']),
                index=df.index,columns=['客戶注冊渠道','size'])
  1. 新增一列
data = data.assign(ration = [4, 2, 5, 6, 7, 8, 2, 9, 4])

data['rations'] = [5, 2, 5, 6, 7, 8, 2, 9, 4]
  1. 對數(shù)據(jù)進行切分
bins = [1,3,6,9]
data_cut = pd.cut(data['data'], bins)

對數(shù)據(jù)進行提取,篩選

df = pd.DataFrame({'A':[7,8,9,20, 10, 11, 14, 13, 14],
                     'B' : [1,2,3,4,5, 6, 7, 7, 8]})
  1. 按條件進行提取
# 選出B列的值大于3的數(shù)
df[df['B']>3]

# 當(dāng) A列的值大于13時, 顯示B,c列的值
df[['B','C']][df['A']>13]

# 用isin函數(shù)進行判斷

# 使用isin函數(shù)根據(jù)特定值篩選記錄。篩選A值等于10或者13的記錄
df[df.A.isin((10, 13))]


# 判斷經(jīng)紀人級別是否為A3
df['經(jīng)紀人級別'].isin(['A3'])


 # 先判斷結(jié)果,將結(jié)果為True的提取
#先判斷經(jīng)紀人級別列里是否包含A3和M4,然后將復(fù)合條件的數(shù)據(jù)提取出來。
df.loc[df['經(jīng)紀人級別'].isin(['A3','M4'])]

# 使用&(并)與| (或)操作符或者特定的函數(shù)實現(xiàn)多條件篩選 

# A列值大于10, 并且B列值大于5
df[(df['A'] > 10) & (df['B'] >5)]
df[np.logical_and(df['A'] > 10, df['B'] > 5)]

# A列值大于10,或 B列值大于5
df[(df['A'] > 10) | (df['C'] >20)]
df[np.logical_or(df['A'] > 10, df['C'] > 20)]
  1. 按索引進行提取
# 按標簽索引
df[1:4]

# 傳入列名
df[['A', 'B']]

# loc函數(shù)
# 知道column names 和index(這里df的index沒有指定,是默認生成的下標),且兩者都很好輸入,可以選擇 .loc同時進行行列選擇

# 根據(jù)標簽取第一行, 顯示為DataFrame格式
df.loc[:0]

# 取標簽為2,3,4, A列的數(shù)據(jù), 顯示為Series格式
df.loc[2:4, 'A']


# iloc函數(shù)
# 行和列都用index來進行提取
df.iloc[0:5, 1:3] 

# 返回第一行 
df.iloc[0,:]

# 返回第一列的第一個元素
df.iloc[0,0]

#[0, 2, 5] 代表指定的行,[ 4, 5 ] 代表指定的列
df.iloc[[0,2,5],[4,5]]

# ix
#ix的功能更加強大,參數(shù)既可以是索引,也可以是名稱,相當(dāng)于,loc和iloc的合體

df.ix[1:3, ['A', 'B']]


# at函數(shù)
根據(jù)指定行index及列l(wèi)abel,快速定位DataFrame的元素,選擇列時僅支持列名
df.at[3, 'A']


# iat函數(shù)
選擇時只使用索引參數(shù)
df.iat[3, 2]

  1. 按日期進行提取
import pandas
import datetime as dt

# 重新設(shè)置索引
df.reset_index()

#設(shè)置日期為索引
df=df.set_index('日期')

#提取2016年11月2號的數(shù)據(jù)
df['2016-11-02' : '2016-11-02']

dt_time = dt.datetime(year = 2018, month=9, day = 17, hour = 22, minute = 43)
print(dt_time)

#構(gòu)造時間
ts = pd.Timestamp('2018-09-17 22:43:00')
ts = pd.to_datetime('2018-09-17 22:43:00')
ts = pd.to_datetime('17/09/2018 22:43:00')

# 月份
ts.month

#日期
ts.day

# 加日期
ts + pd.Timedelta(' 10 days')

ts.hour

# 構(gòu)造時間序列, 構(gòu)造十個日期, 每12分鐘一次
pd.Series(pd.date_range(start = '2018-09-17 22:43:00', periods = 10, freq = '12min'))


讀取文件, 有時間列, 先將時間字符串轉(zhuǎn)換成時間格式, 再進行處理
或當(dāng)讀取數(shù)據(jù)時, 就對數(shù)據(jù)格式進行修改

data = pd.read_csv('.../db.csv', index_col = 0, parse_dates = True)

# 讀取時間為2013年的所有數(shù)據(jù)
data['2013']

# 取所有8點到12點之間的數(shù)據(jù), 不包含8點和12點
data[(data.index.hour > 8) & (data.index.hour < 12)]

# 包含8點到12點
data.between_time('08:00', '12:00')


# 時間序列的重采樣-看每月的平均值
data.resample('M').mean()


數(shù)據(jù)匯總

  1. 對數(shù)據(jù)進行分類 - group by函數(shù)
# 創(chuàng)建數(shù)組
df = pd.DataFrame({'key' : ['a', 'b', 'c','a', 'b', 'c','a', 'b', 'c'],
                    'data' : [0, 2, 4, 5, 6, 7, 8, 9, 4]})

# 分別計算a, b, c 的和
df.groupby('key')['data'].sum()

df.groupby('key')['data'].mean()


s = pd.Series([1, 2, 3,1, 2, 3],[8,7,6,8,7,6])

# 對索引進行排序
grouped = s.groupby(level = 0, sort =False)
grouped.first()

df2 = pd.DataFrame({'x':['a', 'b', 'a', 'b'],
                   'y' : [1, 2, 3, 4]})

# 只關(guān)注x中的b
df3 = df2.groupby(['x']).get_group('b')

# 查看個數(shù)
df2.size()

2, 對數(shù)據(jù)進行透視

pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean')

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                          "bar", "bar", "bar", "bar"],
                    "B": ["one", "one", "one", "two", "two",
                          "one", "one", "two", "two"],
                    "C": ["small", "large", "large", "small",
                          "small", "large", "small", "small",
                          "large"],
                    "D": [1, 2, 2, 3, 3, 4, 5, 6, 7]})

table = pd.pivot_table(df, values='D', index=['A', 'B'],
                     columns=['C'], aggfunc=np.sum)

  1. 對數(shù)據(jù)進行映射
# 用map函數(shù)對字典進行映射, 新加一列
data['upper'] = data['group'].map(dataUpper)

數(shù)據(jù)統(tǒng)計

  1. 數(shù)據(jù)采樣
# 簡單隨機抽取sample
df.sample(n=3)

# 設(shè)置采樣權(quán)重
# 需要對每一行進行權(quán)重設(shè)置,列表行數(shù)少可行,過多不可行

# 假設(shè)有4行數(shù)據(jù),設(shè)置采樣權(quán)重
weights = [0, 0, 0.5, 0.5]
df.sample(n=4, weights=weights)

## 確定采樣后是否放回
# 采樣后放回,True
df.sample(n=6, replace=True)
  1. 統(tǒng)計計算
# 描述統(tǒng)計 describe函數(shù)

#自動生成數(shù)據(jù)的數(shù)量,均值,標準差等數(shù)據(jù)
#round(2),顯示小數(shù)點后面2位數(shù),T轉(zhuǎn)置

df.describe().round(2).T


# 標準差std()
df['經(jīng)紀人響應(yīng)時長'].std()

# 協(xié)方差cov
df['經(jīng)紀人當(dāng)天發(fā)送消息數(shù)'].cov(df['客戶當(dāng)天發(fā)送消息數(shù)']

# 相關(guān)性分析corr
df['客戶當(dāng)天發(fā)送消息數(shù)'].corr(df['經(jīng)紀人當(dāng)天發(fā)送消息數(shù)'])


# 中位數(shù)
df.median()

對字符串進行操作

  1. 大小寫
a.lower()
a.upper()

  1. 長度
# 長度
a.len()
  1. 去除空格
a.strip()
a.lstrip()
alrstrip()
  1. 替換
df.columns.str.replace(' ', '_')
  1. 切分與分列
#切分
a.split('_')
# 切分, 且成為新列
a.split('_', expand = True)
# 對切分進行限制, 只切1次
a.split('_', expand = True, n=1)
# 查看是否包含
a.str.contains('A')
# 分列
s.str.get_dummies(sep= '|')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容