Pandas簡介
Pandas是python數(shù)據(jù)分析中一個非常核心的數(shù)據(jù)庫, 在日常的工作中經(jīng)常需要使用Pandas庫來對數(shù)據(jù)進行處理分析。Pandas的核心為兩大數(shù)據(jù)結(jié)構(gòu), Series和DataFrame,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
- 創(chuàng)建Series對象
zy = pd.Series([2, 3, 4, 6, 7, 4], index = ['a', 'b', 'c', 'd', 'e', 'f'])
- 查看Series對象的兩個數(shù)組
# 查看元素
zy.values
# 查看索引
zy.index
- 查看元素
# 將zy看做Numpy數(shù)組,智定鍵
zy[2]
zy[0:2]
# 指定標簽
zy['c']
zy[['b', 'c']]
- 篩選元素
zy[zy >3]
- 查看組成元素
# 查看包含的不同元素
zy.unique()
zy.value_counts()
- 通過字典來創(chuàng)建
zy=Series({'a':1,'b':2,'c':3})
DataFrame對象

DataFrame
讀取與寫入Excel數(shù)據(jù)
- 讀取文件夾的內(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')
- 讀取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')
- 讀取csv格式Excel表
df = pd.read_csv('E:/工作文件/周報/周數(shù)據(jù)/測試/0902-0908/商品匯總.scsv')
- 讀取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ù)組
- 將數(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')
- 其他數(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ù)
- 表信息
df.info()
- 顯示數(shù)據(jù)的行列數(shù)
df.shape
- 查看數(shù)據(jù)格式dtpyes
df.dtypes
- 顯示列名、元素
df.columns
df.values
- 添加默認列名
# 如果數(shù)據(jù)沒有標題行,可用pandas添加默認的列名
df = pd.read_excel('x.xlsx', header = None)
- 顯示前數(shù)據(jù)前5行
df.head(5)
df[['標題', '客戶端uv']].head()
- 顯示數(shù)據(jù)后5行
df.tail(5)
- 值
df.values
- 讀取a列
df['a']
- 修改索引
df = df.set_index['標題']
- 顯示數(shù)據(jù)唯一值(unique函數(shù))
# 數(shù)據(jù)有0, 是因?qū)θ笔е颠M行了填充
df['經(jīng)紀人級別'].unique()
- 對第幾行數(shù)據(jù)不讀取
#不讀取哪里數(shù)據(jù),可用skiprows=[i],跳過文件的第i行不讀取
df = pd.read_excel('x.xlsx',skiprows=[2] )
- 對缺失值進行識別
# 所有缺失值顯示為True
pd.insull(df) # df.isnull()
- 計算
#計算此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ù)清洗
- 刪除空值 (dropna函數(shù))
df.dropna(how='any')
- 填充空值(fillna函數(shù))
# 空值用0填充
df.fillna(value=0)
# 用均值對空值進行填充
df['經(jīng)紀人響應(yīng)時長'].fillna(df['經(jīng)紀人響應(yīng)時長'].mean())
- 更改數(shù)據(jù)格式
# 將數(shù)據(jù)格式int64,改為float格式
df['大區(qū)'].astype('float64')
- 更改列名稱
df.rename(columns={'IM渠道': '渠道'})
- 找到重復(fù)值
df.duplicated()
- 刪除重復(fù)值
# 默認第一次出現(xiàn)的保留,其余刪除
df['門店'].drop_duplicates()
最后一次出現(xiàn)的保留,其余刪除
df['門店'].drop_duplicates(keep = 'last')
- 對列表內(nèi)的值進行替換
df['客戶UCID'].replace('10531975', '110')
- 找出異常值
print(data.describe())
# 對異常值進行刪除
- 修改數(shù)據(jù)
# 修改結(jié)果
df.replace(參數(shù))
# 修改索引
df.rename(參數(shù))
# 增加
df.append(參數(shù))
# 刪除
def df['a']
df.drop(['a', 'b'], inplace = True)
對數(shù)據(jù)進行處理
- 對兩個數(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')
- 對數(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)
- 對數(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
- 對數(shù)據(jù)進行分列
pd.DataFrame((x.split('網(wǎng)') for x in df['客戶注冊渠道']),
index=df.index,columns=['客戶注冊渠道','size'])
- 新增一列
data = data.assign(ration = [4, 2, 5, 6, 7, 8, 2, 9, 4])
data['rations'] = [5, 2, 5, 6, 7, 8, 2, 9, 4]
- 對數(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]})
- 按條件進行提取
# 選出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)]
- 按索引進行提取
# 按標簽索引
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]
- 按日期進行提取
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ù)匯總
- 對數(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)
- 對數(shù)據(jù)進行映射
# 用map函數(shù)對字典進行映射, 新加一列
data['upper'] = data['group'].map(dataUpper)
數(shù)據(jù)統(tǒng)計
- 數(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)
- 統(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()
對字符串進行操作
- 大小寫
a.lower()
a.upper()
- 長度
# 長度
a.len()
- 去除空格
a.strip()
a.lstrip()
alrstrip()
- 替換
df.columns.str.replace(' ', '_')
- 切分與分列
#切分
a.split('_')
# 切分, 且成為新列
a.split('_', expand = True)
# 對切分進行限制, 只切1次
a.split('_', expand = True, n=1)
# 查看是否包含
a.str.contains('A')
# 分列
s.str.get_dummies(sep= '|')