pandas以前笔记
生活随笔
收集整理的這篇文章主要介紹了
pandas以前笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
# -*- coding: utf-8 -*-
"""
Created on Sat Jul 21 20:06:20 2018@author: heimi
"""
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
#導入自定義模塊
import sys
from pandas import Series,DataFrame
from numpy import nan as NA
from os import path
# sys.path.append( path.dirname(path.dirname(path.abspath(__file__))))
# import mytools.midtools as midtools
# from matplotlib.font_manager import FontProperties
#顯示中文
# font=FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=12)path=r'D:/code12temp/自己筆記/'
pd.set_option('display.width',None)data=DataFrame(np.arange(16).reshape(4,4),index=list("ABCD"),columns=list("wxyz"))
print(data)#可以直接取列索引,行索引確不行
aa=data["w"]
bb=data[1:2] #行數值切片
cc=data[1:2,1:2] #不能同時切片,也就是中間不能有逗號# Series數據的連接
s1 = Series([0,1],index=["a","b"])
s2 = Series([2,3,4],index=["c","d","e"])
s3 = Series([5,6],index=["f","g"])
result = pd.concat([s1,s2,s3])
resultresult = pd.concat([s1,s2,s3],keys=["one","two","three"])
result
#直接在外面再追加一層索引#合并重疊數據
a = Series([NA,2.5,NA,3.5,4.5,NA],index=list("fedcba"))
b = Series(np.arange(len(a)),dtype=np.float64,index=list("fedcba"))
pd.concat([a,b])#用其中一個Series中的數據給另一個Series中的數據作為補丁
resultB = b[:-2]
resultB
resultA = a[2:]
resultA
resultB.combine_first(resultA) #二者索引相同的時候 用ResultB的索引優先
# 而且B的元素為NAN的,通過A中有點來填充,B 中沒有的,A中有的,直接填上
# 反正就是A的元素只會增加,不會減少#創建層次化索引 兩層索引
data = Series(np.random.randn(10),index= [list("aaabbbccdd"),[1,2,3,1,2,3,1,2,2,3]])
data# 將行索引(index)轉換到列索引上(columns) 沒行列
result = data.unstack()
result
result.stack()# DataFrame 中的行索引和列索引的重塑和轉換
data = DataFrame(np.arange(6).reshape(2,3),index=pd.Index(["上海","北京"],name="省份"),columns=pd.Index([2011,2012,2013],name="年份"))
data
# 將DataFrame的列索引轉化到行索引 烈士
result = data.stack()#將DataFrame的行索引轉化為列索引
#unstack()默認轉換的最內層的層次化索引
result.unstack()
#第一種方法,轉換的時候,指定層次化索引的名稱
result=result.unstack("省份") #相當于交換了行列
result.stack()#第二種方法,轉換的時候,指定層次化的索引 0是result的第一列,1是后面一層
data=result.unstack(1)
data.unstack(1)#在對DataFrame進行unstack操作時,作為旋轉軸的級別將會成為結果中的最低級別
data = DataFrame(np.arange(6).reshape(2,3),index=pd.Index(["Ohio","Colorado"],name="state"),columns=pd.Index(["one","two","three"],name="nu mbers"))
data
result = data.stack()df = DataFrame({"left":result, #直接以series 為對象 并帶來了行索引"right":result+5},columns=pd.Index(["left","right"],name="side"))
dfresult = df.unstack("state") #放到原來索引的下一層s1=Series([0,1,2,3],index=list("abcd"))
s2 = Series([4,5,6],index=list("cde"))
#將s1和s2拼接成一個具有層次化索引的Series
result = pd.concat([s1,s2],keys=["one","two"])
result
#將結果中的行索引變成列索引 #多層索引序號以零開頭
tempResult = result.unstack(1)
tempResult#全部還原,空值用NaN填充
tempResult.stack(dropna=False)# 3、pandas高級應用–數據轉化、清除重復數據
data = DataFrame({"k1":["one"]*3+["two"]*4,"k2":[1,1,2,3,3,4,4]})
#第一種方法,去重
#檢測DataFrame中的每行數據是否為重復數據行
mask = data.duplicated() #當前行的記錄和上一行記錄進行比較
mask#通過花式索引去除重復的數據
data[~mask] #保留為false的#第二種方法:去重
#通過DataFrame內置的drop_duplicates()方法去除重復的數據行.
#去除data.drop_duplicates()
data["v1"] = range(7)# 只以k1這一列為標準去重
data.drop_duplicates(["k1"])#通過制定keep參數制定需要保留特定的重復數據
#keep="first" 保留重復數據第一次出現的行索引
#keep="last" 保留重復數據最后一次的行索引
#keep=False 只要有重復數據,就全部丟掉data=DataFrame({'food':['bacon','pulled pork','bacon','Pastrami','corned beef','Bacon','pastrami','honey ham','nova lox'],'ounces':[4,3,12,6,7.5,8,3,5,6]})meat_to_animal={'bacon':'pig','pulled pork':'pig','pastrami':'cow','corned beef':'cow','honey ham':'pig','nova lox':'salmon'}
data["animal"]=data["food"].map(str.lower).map(meat_to_animal)
data["animal"] = data['food'].map(lambda x: meat_to_animal[x.lower()])
#這里的x.lower相當key了# 4、pandas高級應用–數據替換
series = Series([1,-999,2,-999,-1000,3])
#單個數據替換
series.replace(-999,NA)
#多個數據替換
series.replace([-999,-1000],NA)#replace方法傳入字典,針對不同的值,進行不同的替換
#第一種方法
series.replace({-999:NA,-1000:0})#第二種方法
series.replace([-999,-1000],[NA,0])# 5、pandas高級應用–數據拆分
from matplotlib import pyplot as pltage = [20,22,25,27,21,23,37,31,61,45,41,32]
#將所有年齡進行分組
bins = [18,25,35,60,100] #前開后閉
#使用pandas中的cut對年齡數據進行分組
cats = pd.cut(age,bins)#調用pd.value_counts方法統計每個區間段的人數
pd.value_counts(cats) #直接統計#區間屬于那一行索引 按大小排序的
cats.codes#為分類出每一組年齡加上標簽
group_names = ["Youth","YouthAdult","MiddleAged","senior"]#用group_name中的值,把區間替換
personType = pd.cut(age,bins,labels=group_names) #為什么這里不對plt.hist(personType)
plt.show()# 06、pandas高級應用–數據分割data = np.random.randn(1000) # 服從正太分布
result = pd.qcut(data,4) # cut將data數據均分為4組
result# 統計落在每個區間的元素個數
pd.value_counts(result)# cut函數分割一組數據 cut計算:找出data中的最大值最小值,之差除以4,得出區間值,然后以這個區間值分四份
data = np.random.randn(20)# 用cut函數將一組數據分割成n份 precision:保留小數點的有效位數
result = pd.cut(data,4,precision=2)
pd.value_counts(result)data = np.random.randn(1000)
# 根據分位數差的百分比分割
result=pd.qcut(data,[0,0.1,0.5,0.9,1.0])
pd.value_counts(result)# 如果分為數的差值的和小于1的情況 分割的結果,安裝分位數差之和計算
result = pd.qcut(data,[0,0.1,0.3,0.75])
pd.value_counts(result)# series.str.contains
# http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html# 07、pandas高級應用–數據的過濾和篩選
#
data = np.random.randn(1000,4)
df = DataFrame(data)
# np.random.seed(num) #num是生成隨機數的種子
# np.random.randn() ##默認生成隨機數的種子數是當前時間的時間戳
#定義一個種子數
np.random.seed(33)
np.random.rand()np.random.seed(12345)
data = DataFrame(np.random.randn(1000,4))
data
# 簡單的數據統計信息
data.describe()# 獲取數據的第四列
col = data[3]
# 篩選出絕對值大于3的數 #對series 直接飲用 np的數學函數,用中括號來放置條件
col[np.abs(col)>3]# 查找出數據集中有任意某一列的值出現大于3的行數據
data[(np.abs(data)>3).any(1)] #對所有列進行處理# 將所有絕對值大于3的正數設置為3,絕對值大于3的負數設置為-3
# 獲取數據的符號
data[np.abs(data)>3] = np.sign(data)*3 #取符號
data.describe()
# 08、pandas高級應用–讀寫文件數據
import sys# pandas讀取csv文件
data = pd.read_csv('data/ex1.csv')
data
# 讀取的csv文件沒有標題,默認分配表頭索引
pd.read_csv('data/ex2.csv',header=None)
# 自定義添加標題
pd.read_csv('data/ex2.csv',names=['a','b','c','e','name'])
# 指定行索引
pd.read_csv('data/ex2.csv',names=['a','b','c','e','name'],index_col='name') #不是很懂# 將讀取的數據進行層次化索引
pd.read_csv('data/csv_mindex.csv',index_col=['key1','key2'])# 通過skiprows參數指定需要跳過的行索引
pd.read_csv('data/ex4.csv',skiprows=[0,2,3])# 加載存在NaN值缺值數據,把na_values對應的值替換為NaN
pd.read_csv('data/ex5.csv',na_values=3)# 把數據集中的NAN值替換
data.to_csv(sys.stdout,na_rep=['NULL'])# 只寫入數據,不寫入行和列的索引
data.to_csv(sys.stdout,index=False,header=False)
data.to_csv('data/aa.csv',index=False,header=False)# 通過columns來指定寫入文件中的列
data.to_csv(sys.stdout,index=False,columns=['a','c','message'])# 09、pandas高級應用–數據的聚合及分組計算df = DataFrame({"key":['a','a','b','b','a'],"key2":['one','two','one','two','one'],"data1":np.random.randn(5),"data2":np.random.randn(5)})
df
# 選取data1數據列按照key1進行分組
groupd = df["data1"].groupby(df['key']) #除了可以按列分組,也可以按行分組
# 調用已經分組好的數據中一些方法,即可得出相應的統計結果
# 獲取分組中每一組數據的平均值
groupd.mean()# 根據key和key2兩個列數據進行分組
grouped = df['data1'].groupby([df['key'],df['key2']])
# 求平均
grouped.mean()# 獲取分組后每一組中相應元素出現的次數
df.index
df.groupby([df['key'],df['key2']]).size() #或 df.groupby(['key','key2']).size() #按行索引分組# for in 循環輸出分組的結果
for name,group in df.groupby("key"):print(name)print(group)# 將groupby 分類結果轉化成字典
pices = dict(list(df.groupby('key'))) #list的時候以逗號分隔key和values,dict 以分號代替逗號
pices['b']# 按照列的數據類型分組
group = df.groupby(df.dtypes,axis=1)
dict(list(group))
group.size()# 選擇分類數據中的一個或一組
# 方法一: 生成的數據類型是DataFrame
df.groupby(['key','key2'])[['data2']].mean()# 方法二: 生成的類型是series
df['data2'].groupby([df['key'],df['key2']]).mean() #series 的groupby 和 dataframe 的groupby 是不一樣的# 方法三:
df.groupby(['key','key2'])['data2'].mean()# 通過字典或series進行分組
people = DataFrame(np.random.randn(5,5),columns=list('abcde'),index=['Joe','Stenve','Wes','Jim','Travis'])
people
# 創建一個將列名進行映射的字典
mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
by_columns = people.groupby(mapping,axis=1) #相當于對列進行分組
gp=dict(list(by_columns)) #分組之后結果展示
gp['blue']
by_columns.sum() #橫向相加# 將mapping轉化成Series
seriesMap = Series(mapping)people.groupby(seriesMap,axis=1).count() #即是不是這個dataframe的列也是可以作為分組的 #對列的數目進行統計 對每個行索引來說# 分組后常用的計算方法
dict_obj = {'key1' : ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'],'key2' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],'data1': np.random.randint(1,10, 8),'data2': np.random.randint(1,10, 8)}
df = DataFrame(dict_obj)# 按照key1進行分組求和
df.groupby('key1').sum()
df[['data1']].groupby(df['key1']).sum()
# 求最大值
df.groupby('key1').max()df.groupby('key1').describe()# 第一種方法
# 定義一個函數,求獲得DataFrame中某一列數據的最大值和最小值之差
def peak_range(df):print(type(df))return df.max()-df.min()df.groupby('key1').agg(peak_range) #分組之后對每列進行函數處理
# 用匿名函數的方式
# 第二種方法
df.groupby('key1').agg(lambda df: df.max()-df.min())# 使用agg對分組后的數據調用多個聚合函數
df.groupby('key1').agg(['mean','sum','count','min','std',peak_range]) # 帶引號的參數是內置聚合函數df.groupby('key1').agg(['mean','sum','count','min','std',('ptp',peak_range)]) #peak_range 給peak_range起一個別名,叫ptp #起別名# 使用字典實現數據集的每列作用不同的聚合函數
dict_mapping = {'data1':'mean','data2':'sum'}
df.groupby('key1').agg(dict_mapping) #agg 傳入函數 對每列進行不同的操作# 以"沒有索引形式"返回聚合函數的計算結果
df = pd.DataFrame(data={'books':['bk1','bk1','bk1','bk2','bk2','bk3'], 'price': [12,12,12,15,15,17]})
# 將分組之后的books列作為索引
df.groupby("books",as_index=True).sum() #默認對剩下的price 進行處理# 不讓分組之后的books列作為索引
df.groupby("books",as_index=False).sum()tips=pd.read_csv(path+'/input/pandasData/tips.csv',encoding='gbk')
# 10、pandas高級應用–分組計算apply
# 為tips數據集添加新的一列,作為客戶給的小費占消費總額的百分比
tips['tip_pct'] = tips['tip']/tips['total_bill']# 定義函數,篩選出小費占比最大的前五條數據
def top(df,n=5,columns='tip_pct'):return df.sort_values(by=columns)[-n:]
top(tips,n=6)#對數據集按抽煙進行分組
group = tips.groupby('smoker')group# 使用apply方法分別求出抽煙和不抽煙的客戶中的消費占比排在前五客戶
group.apply(top) #直接對分組結果進行應用函數 相當于對兩類都進行了處理# 顯示抽煙和不抽煙客戶的數量
group.size()
group.count()# 為apply中使用的函數傳參
tips.groupby(['smoker','day'],group_keys=False).apply(top,columns='total_bill',n=2) #前面是函數,后面是參數
#不顯示key
frame = pd.DataFrame({'data1': np.random.randn(1000),'data2': np.random.randn(1000)})result = pd.cut(frame.data1,4) #每個值對應一個區間
pd.value_counts(result)# 定義一個函數,求data1數據列各項參數計算
def get_stats(group):return { 'min': group.min(), 'max': group.max(),'count':group.count(), 'mean': group.mean() }
grouped = frame.data2.groupby(result)dict(list(grouped))grouped.apply(get_stats).unstack()# 加權平均和相關系數
df = pd.DataFrame({'category': ['a', 'a', 'a', 'a', 'b', 'b', 'b','b'],'data': np.random.randn(8), 'weights': np.random.rand(8)})
grouped = df.groupby('category')
grouped.size()# Python數據處理進階——pandas
# https://www.cnblogs.com/llhy1178/p/6762459.htmldf = DataFrame(np.random.randn(4,3), columns= list("bde"),index= ["Utah", "Ohio", "Texas", "Oregon"])# print np.abs(df)
# 將函數應用到各列或行所形成的一維數組上。
f = lambda x : x.max() - x.min()
# 每一列的最大值減最小值
print (df.apply(f, axis=0))
# 每一行的最大值減最小值
print (df.apply(f, axis=1))
# 返回值由多個值組成的Series# 返回值由多個值組成的Series
def f(x):return Series([x.min(), x.max()], index=["min","max"]) #對每列進行處理
print (df.apply(f)) #默認是對列進行操作
# 保留兩位小數點
format = lambda x : "%.2f" % x
print (df.applymap(format)) #apply對series和對整個dataframe,applymap 對整個dataframe,map對series
print (df["e"].map(format))
# 總的來說就是apply()是一種讓函數作用于列或者行操作,applymap()是一種讓函數作用于DataFrame每一個元素的操作,而map是一種讓函數作用于Series每一個元素的操作# 排序和排名
obj = Series(np.arange(4.), index=["b","a","d","c"])
# print obj.sort_index()
frame = DataFrame(np.arange(8).reshape((2,4)),index=["three","one"],columns=["d",'a','b','c'])
# 按照索引的行進行排序
print (frame.sort_index(axis=1))
# 按照索引的列進行排序
# print frame.sort_index(axis=0)
# 按照值的列進行排序(必須傳入一個列的索引且只能排列一組)
frame.sort_values('b', axis=0, ascending=False)
# 按照值的行進行排序(必須傳入一個行的索引且只能排列一組)
frame.sort_values("one", axis=1, ascending=False)
# 根據多個列進行排序
frame.sort_index(by=["a","b"])# 排名
obj1 = Series([7,-5,7,4,2,0,4])
obj1.rank()# 加減乘除 add代表加,sub代表減, div代表除法, mul代表乘法
df1 = DataFrame(np.arange(12).reshape((3,4)), columns=list("abcd"))
df2 = DataFrame(np.arange(20).reshape((4,5)), columns=list("abcde"))df1 + df2 #找不到匹配的位置直接為空
# 將缺失值用0代替
df1.add(df2, fill_value=0) #找不到匹配的位置用單獨一方的值替代
# 再進行重新索引時,也可以指定一個填充值
df1.reindex(columns=df2.columns, fill_value=0)data = {"state": ["Ohio","Ohio","Ohio","Nevada","Nevada"],"year" : [2000, 2001, 2002, 2001, 2002],"pop" : [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
# frame
# 矩陣的橫坐標
# frame.columns
# 矩陣的縱坐標
# print frame.index
# 獲取列通過類似字典標記的方式或屬性的方式,可以將DataFrame的列獲取為一個Series:
# print frame["state"]
# print frame.year
# 獲取行也通過類似字典標記的方式或屬性的方式,比如用索引字段ix
# print frame.ix[3]# 精準匹配
val = Series([-1.2, -1.5, -1.7], index=["two", "four", "five"])
frame.index = Series(['one', 'two', 'three', 'four', 'five'])
frame.debt = val #debt 是啥東東
# print frame
# 為不存在的列賦值存在列中的某個值會創建出一個布爾列。關鍵字del用于刪除列。
frame["eastern"] = frame.state == "Ohio"del frame["eastern"] # 只能這樣表示 刪除列# 嵌套字典
pop = { "Nevada" : {2001 : 2.4, 2002 : 2.9},"Ohio" : {2000 : 1.5, 2001 : 1.7, 2002 : 3.6}}
# 傳給DataFrame,它會被解釋為:外層字典的鍵作為列,內層鍵則作為行索引
frame2 = DataFrame(pop)
# 對該結果進行轉置
frame2.T
# 內層字典的鍵會被合并、排序以形成最終的索引。
frame3 = DataFrame(pop, index=[2001, 2002, 2003])
frame3.index.name = "year"; frame3.columns.name = "state" #索引和列只有一個名字# 重新索引
obj = Series([4.5, 7.2, -5.3, 3.6], index=["d", "b", "a", "c"])
# reindex將會根據新索引進行重排。
obj2 = obj.reindex(["a", "b", "c", "d", "e"])
# print obj2
# 將缺失值用0代替
obj2 = obj.reindex(["a", "b", "c", "d", "e"], fill_value= 0)
# print obj2# 插值處理--Series
obj3 = Series(["blue", "purple", "yellow"], index=[0,2,4])
# 前向填充ffill或pad
obj3.reindex(range(6), method="ffill")
# print a
# 后向填充bfill或backfill
b = obj3.reindex(range(6), method="bfill")
# print b# 插值處理--DataFrame
import numpy as np
f = DataFrame(np.arange(9).reshape((3,3)), index=["a","c","d"],columns=["Ohio", "Texas", "California"])
# 改變行的索引
f2 = f.reindex(["a","b","c","d"], fill_value=9)
# print f2
# 改變列的索引
col = ["Texas", "Utah", "California"]
f3 = f.reindex(columns=col)
# print f3
# 同時改變列和行的索引 不成功
f4 = f.reindex(["a","b","c","d"], method="ffill",columns=["Texas", "Utah", "California"])
# print f4# 丟棄指定軸上的項--Series
mys = Series(np.arange(5.), index=["a","b","c","d","e"])
# print mys
# drop()刪除某個索引以及對應的值
mys_new = mys.drop("c")
# print mys_new
mys_new1 = mys.drop(["c","e"])
# print mys_new1# 丟棄指定軸上的項--DataFrame
data = DataFrame(np.arange(16).reshape((4,4)),index=["Ohio", "Colorado", "Utah", "New York"],columns=["one", "two", "three", "four"])
# 刪除某行軸上的值
data1 = data.drop(["Ohio","Utah"], axis=0) # axis=0代表行
# print data1
# 刪除某列軸上的值
data2 = data.drop(["one","three"], axis=1) # axis=1代表列
# print data2obj = Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
# 使用is_unique屬性可以知道他的值是否是唯一的
obj.index.is_unique
# obj['a']
df = DataFrame(np.random.randn(4, 3), index=['a', 'b', 'a', 'b'])
df.ix["b", 1]
df[1]
# pandas中的索引高級處理:# 索引、選取和過濾--Series
obj = Series(np.arange(4), index=["a","b","c","d"])
# print obj["b"]
# print obj[1]
# print obj[2:4]
# print obj[["b","a","d"]]
# print obj[[1,3]]
# print obj[obj < 2]
# 利用標簽的切片運算與普通的python切片運算不同,其末端是包含的
# print obj["b":"c"]
obj["b":"c"] = 5
# print obj
總結
以上是生活随笔為你收集整理的pandas以前笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iloc loc 区别
- 下一篇: Python 属性__getattrib