概述Excel固然功能強大,也有許多函數(shù)實現(xiàn)數(shù)據(jù)處理功能,但是Excel仍需大量人工操作,雖然能嵌入VB腳本宏,但也容易染上宏病毒。python作為解釋性語言,在數(shù)據(jù)處理方面擁有強大的函數(shù)庫以及第三方庫,excel作為主要基礎(chǔ)數(shù)據(jù)源之一,在利用數(shù)據(jù)進(jìn)行分析前往往需要預(yù)先對數(shù)據(jù)進(jìn)行整理。因此,本文就python處理excel數(shù)據(jù)進(jìn)行了學(xué)習(xí),主要分為python對excel數(shù)據(jù)處理的常用數(shù)據(jù)類型以及常用函數(shù),用python語言實現(xiàn)excel基本操作。
常用數(shù)據(jù)類型序列sequence, 列表list, 元組tuple, array,字典dictionary,series,dataframe,集合set區(qū)別序列首先,序列是是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。每個索引對應(yīng)一個元素。Python包含 6 中內(nèi)建的序列,包括列表、元組、字符串、Unicode字符串、buffer對象和xrange對象。 對于序列,都可以使用以下操作: 索引 切片 加 乘 成員檢查 計算序列的長度 取序列中的最大、最小值
列表list概述用途一組有序項目的集合??勺兊臄?shù)據(jù)類型【可進(jìn)行增刪改查】 列表是以方括號“[]”包圍的數(shù)據(jù)集合,不同成員以“,”分隔。 列表中可以包含任何數(shù)據(jù)類型,也可包含另一個列表 列表可通過序號訪問其中成員
聲明方式example = [0,1,2,3,4,5,6,7,8,9] APIPython列表腳本操作符Python列表函數(shù)Python列表方法切片#列表操作補充--切片操作
example = [0,1,2,3,4,5,6,7,8,9]
#打印某一區(qū)間 左閉右開
print(example[4:8])
#想包含最后一個
print(example[4:])
#包含首個
print(example[:8])
#所有的
print(example[:])
#第三個參數(shù)為步長
print(example[1:8:2])
#倒序輸出
print(example[::-1])
#列表合并
a = [1,2,3]
b = [4,5,6]
print(a+b)
#替換
ex = [1,2,3,4,5,6]
ex[4:]=[9,8,7]
print(ex)#將56換為987 判斷列表中>>> list4=[123,["das","aaa"],234]
>>> list4
>>> "aaa" in list4 #in只能判斷一個層次的元素
False
>>> "aaa" in list4[1] #選中列表中的列表進(jìn)行判斷
True
>>> list4[1][1]
'aaa' 元組tuple概述用途聲明方式L=(1,2,3)
含0個元素的元組: L = () 元組操作訪問元組 >>> o =('a','b','c',('d1','d2'))
>>> print o[0]
>>> print o[3][0]
a
d1 >>> age=22
>>> name='sandra'
>>> print'%s is %d years old'%(name,age)
sandra is 22 years old 修改元組 (元組中的元素值是不允許修改的,但我們可以對元組進(jìn)行連接組合,如下實例) tup1 = (12, 34.56);
tup2 = ('abc', 'xyz');
# 以下修改元組元素操作是非法的。
# tup1[0] = 100;
# 創(chuàng)建一個新的元組
tup3 = tup1 + tup2;
print tup3; 添加元組 #通過切片方法添加
a=(1,2,3,4,5,6)
a=a[:2]+(10,)+a[2:]
a 刪除元素 del tup1 API元組運算符與字符串一樣,元組之間可以使用 + 號和 * 號進(jìn)行運算。這就意味著他們可以組合和復(fù)制,運算后會生成一個新的元組。 元組內(nèi)置函數(shù)字典dictionary概述用途聲明方式d = {key1 : value1, key2 : value2 }
//鍵必須是唯一的,但值則不必。
//值可以取任何數(shù)據(jù)類型,但鍵必須是不可變的,如字符串,數(shù)字或元組。 字典操作訪問字典里的值 dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
dict['Name']
dict['Age'] 修改字典 dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
dict['Age'] = 8;
dict['School'] = "DPS School" 刪除字典元素 能刪單一的元素也能清空字典,清空只需一項操作。 顯示刪除一個字典用del命令,如下實例: dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
del dict['Name']; # 刪除鍵是'Name'的條目
dict.clear(); # 清空詞典所有條目
del dict ; # 刪除詞典 API字典內(nèi)置函數(shù)字典內(nèi)置方法ndarray(數(shù)組)–numpy概述用途python中的list是python的內(nèi)置數(shù)據(jù)類型,list中的數(shù)據(jù)類不必相同的,而array的中的類型必須全部相同。在list中的數(shù)據(jù)類型保存的是數(shù)據(jù)的存放的地址,簡單的說就是指針,并非數(shù)據(jù),這樣保存一個list就太麻煩了,例如list1=[1,2,3,'a’]需要4個指針和四個數(shù)據(jù),增加了存儲和消耗cpu。numpy中封裝的array有很強大的功能,里面存放的都是相同的數(shù)據(jù)類型 1)numpy array 必須有相同數(shù)據(jù)類型屬性 ,Python list可以是多種數(shù)據(jù)類型的混合 2)numpy array有一些方便的函數(shù) 3)numpy array數(shù)組可以是多維的 聲明方式np.array用來創(chuàng)建ndarray類型 b=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]) APIseries-pandas概述用途class pandas.Series(data = None,index = None,dtype = None,name = None,copy = False,fastpath = False ) 帶軸標(biāo)簽的一維ndarray(包括時間序列)。 標(biāo)簽不一定是唯一的,但必須是可清洗的類型。該對象支持基于整數(shù)和基于標(biāo)簽的索引,并提供了許多方法來執(zhí)行涉及索引的操作。來自ndarray的統(tǒng)計方法已被覆蓋,以自動排除缺失的數(shù)據(jù)(目前表示為NaN)。 Series(+, - ,/ , *)之間的操作根據(jù)其關(guān)聯(lián)的索引值對齊值 - 它們不必是相同的長度。結(jié)果索引將是兩個索引的排序并集。 聲明Python列表,index與列表元素個數(shù)一致 In [1]: import pandas as pd
In [2]: list_a = [2,4,5,6]
In [3]: pd.Series(list_a)
Out[3]:
0 2
1 4
2 5
3 6
dtype: int64 標(biāo)量值,index表達(dá)Series類型的尺寸 In [4]: pd.Series(1,index = [1,2,3])
Out[4]:
1 1
2 1
3 1
dtype: int64 Python字典,鍵值對中的“鍵”是索引,index從字典中進(jìn)行選擇操作 In [5]: pd.Series({'a':1,'b':3})
Out[5]:
a 1
b 3
dtype: int64
#如果定義的index在原字典中已經(jīng)存在,那么該索引會一直對應(yīng)原字典的值,如果index對應(yīng)不到原字典的值,則會返回NaN
In [11]: pd.Series({'a':1,'b':3},index = ['b','a','c'])
Out[11]:
b 3.0
a 1.0
c NaN
dtype: float64 ndarray,索引和數(shù)據(jù)都可以通過ndarray類型創(chuàng)建 In [9]: list_b = np.arange(6)
In [10]: pd.Series(list_b)
Out[10]:
0 0
1 1
2 2
3 3
4 4
5 5
dtype: int32 其他函數(shù),range()函數(shù)等 In [12]: pd.Series(range(3))
Out[12]:
0 0
1 1
2 2
dtype: int32 series操作Series類型包括index和values兩部分 In [14]: a = pd.Series({'a':1,'b':5})
In [15]: a.index
Out[15]: Index(['a', 'b'], dtype='object')
In [16]: a.values #返回一個多維數(shù)組numpy對象
Out[16]: array([1, 5], dtype=int64) Series類型的操作類似ndarray類型 #自動索引和自定義索引并存,但不能混用
In [17]: a[0] #自動索引
Out[17]: 1
#自定義索引
In [18]: a['a']
Out[18]: 1
#不能混用
In [20]: a[['a',1]]
Out[20]:
a 1.0
1 NaN
dtype: float64 Series類型的操作類似Python字典類型 #通過自定義索引訪問
#對索引保留字in操作,值不可以
In [21]: 'a' in a
Out[21]: True
In [22]: 1 in a
Out[22]: False Series類型在運算中會自動對齊不同索引的數(shù)據(jù) In [29]: a = pd.Series([1,3,5],index = ['a','b','c'])
In [30]: b = pd.Series([2,4,5,6],index = ['c,','d','e','b'])
In [31]: a+b
Out[31]:
a NaN
b 9.0
c NaN
c, NaN
d NaN
e NaN Series對象可以隨時修改并即刻生效 In [32]: a.index = ['c','d','e']
In [33]: a
Out[33]:
c 1
d 3
e 5
dtype: int64
In [34]: a+b
Out[34]:
b NaN
c NaN
c, NaN
d 7.0
e 10.0
dtype: float64 dataframe-pandas概述用途DataFrame提供的是一個類似表的結(jié)構(gòu),由多個Series組成,而Series在DataFrame中叫columns 聲明方式import pandas as pd
from pandas import Series, DataFrame
import numpy as np
data = DataFrame(np.arange(15).reshape(3,5),index=['one','two','three'],columns=['a','b','c','d','e'])
print data a b c d e
one 0 1 2 3 4
two 5 6 7 8 9
three 10 11 12 13 14 arrayimport pandas as pd
import numpy as np
s1=np.array([1,2,3,4])
s2=np.array([5,6,7,8])
df=pd.DataFrame([s1,s2])
print df series列表(效果與二維array相同)import pandas as pd
import numpy as np
s1=pd.Series(np.array([1,2,3,4]))
s2=pd.Series(np.array([5,6,7,8]))
df=pd.DataFrame([s1,s2])
print df value為Series的字典結(jié)構(gòu)import pandas as pd
import numpy as np
s1=pd.Series(np.array([1,2,3,4]))
s2=pd.Series(np.array([5,6,7,8]))
df=pd.DataFrame({"a":s1,"b":s2});
print df 操作直接取值df.[] df=pd.DataFrame({"A":[1,2,3,4],"B":[5,6,7,8],"C":[1,1,1,1]})
df=df[df.A>=2]
print df 使用.loc[] df=pd.DataFrame({"A":[1,2,3,4],"B":[5,6,7,8],"C":[1,1,1,1]})
df=df.loc[df.A>2]
print df .ix[]索引 print df.columns.size#列數(shù) 2
print df.iloc[:,0].size#行數(shù) 3
print df.ix[[0]].index.values[0]#索引值 0
print df.ix[[0]].values[0][0]#第一行第一列的值 11
print df.ix[[1]].values[0][1]#第二行第二列的值 121 APIgroup(groupby 形成group) df = pd.DataFrame({'animal': 'cat dog cat fish dog cat cat'.split(),
'size': list('SSMMMLL'),
'weight': [8, 10, 11, 1, 20, 12, 12],
'adult' : [False] * 5 + [True] * 2});
#列出動物中weight最大的對應(yīng)size
group=df.groupby("animal").apply(lambda subf: subf['size'][subf['weight'].idxmax()])
print group 使用get_group 取出其中一分組
df = pd.DataFrame({'animal': 'cat dog cat fish dog cat cat'.split(),
'size': list('SSMMMLL'),
'weight': [8, 10, 11, 1, 20, 12, 12],
'adult' : [False] * 5 + [True] * 2});
group=df.groupby("animal")
cat=group.get_group("cat")
print cat 集合概述作用集合中包含一系列的元素,在Python中這些元素不需要是相同的類型,且這些元素在集合中是沒有存儲順序的。 聲明>>> {1,2,"hi",2.23}
{2.23, 2, 'hi', 1}
>>> set("hello")
{'l', 'h', 'e', 'o'} 注:由于集合和字典都用{}表示,所以初始化空的集合只能通過set()操作,{}只是表示一個空的字典 集合操作集合的增加 >>> a={1,2}
>>> a.update([3,4],[1,2,7])
>>> a
{1, 2, 3, 4, 7}
>>> a.update("hello")
>>> a
{1, 2, 3, 4, 7, 'h', 'e', 'l', 'o'}
>>> a.add("hello")
>>> a
{1, 2, 3, 4, 'hello', 7, 'h', 'e', 'l', 'o'} 集合的刪除 >>> a={1,2,3,4}
>>> a.discard(1)
>>> a
{2, 3, 4}
>>> a.discard(1)
>>> a
{2, 3, 4}
>>> a.remove(1)
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 1 集合也支持pop()方法,不過由于集合是無序的,pop返回的結(jié)果不能確定,且當(dāng)集合為空時調(diào)用pop會拋出KeyError錯誤,可以調(diào)用clear方法來清空集合: >>> a={3,"a",2.1,1}
>>> a.pop()
>>> a.pop()
>>> a.clear()
>>> a
set()
>>> a.pop()
Traceback (most recent call last):
File "<input>", line 1, in <module>
KeyError: 'pop from an empty set' API集合操作并集:set.union(s),也可以用a|b計算 交集:set.intersection(s),也可以用a&b計算 差集:set.difference(s),也可以用a-b計算 需要注意的是Python提供了一個求對稱差集的方法set.symmetric_difference(s),相當(dāng)于兩個集合互求差集后再求并集,其實就是返回兩個集合中只出現(xiàn)一次的元素,也可以用a^b計算。
>>> a={1,2,3,4}
>>> b={3,4,5,6}
>>> a.symmetric_difference(b)
{1, 2, 5, 6}
2
4 set.update(s)操作相當(dāng)于將兩個集合求并集并賦值給原集合,其他幾種集合操作也提供各自的update版本來改變原集合的值,形式如intersection_update(),也可以支持多參數(shù)形式。 包含關(guān)系兩個集合之間一般有三種關(guān)系,相交、包含、不相交。在Python中分別用下面的方法判斷: set.isdisjoint(s):判斷兩個集合是不是不相交 set.issuperset(s):判斷集合是不是包含其他集合,等同于a>=b set.issubset(s):判斷集合是不是被其他集合包含,等同于a<=b 如果要真包含關(guān)系,就用符號操作>和<。
不變集合Python提供了不能改變元素的集合的實現(xiàn)版本,即不能增加或刪除元素,類型名叫frozenset,使用方法如下: >>> a = frozenset("hello")
>>> a
frozenset({'l', 'h', 'e', 'o'})
2 需要注意的是frozenset仍然可以進(jìn)行集合操作,只是不能用帶有update的方法。如果要一個有frozenset中的所有元素的普通集合,只需把它當(dāng)作參數(shù)傳入集合的構(gòu)造函數(shù)中即可: python excel操作##生成數(shù)據(jù)表 準(zhǔn)備import numpy as np
import pandas as pd 導(dǎo)入數(shù)據(jù)表df=pd.DataFrame(pd.read_csv('name.csv',header=1))
df=pd.DataFrame(pd.read_excel('name.xlsx')) 創(chuàng)建數(shù)據(jù)表df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
"date":pd.date_range('20130102', periods=6),
"city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age":[23,44,54,32,34,32],
"category":['100-A','100-B','110-A','110-C','210-A','130-F'],
"price":[1200,np.nan,2133,5433,np.nan,4432]},
columns =['id','date','city','category','age','price']) 數(shù)據(jù)表檢查python中處理的數(shù)據(jù)量通常會比較大,,我們無法一目了然的了解數(shù)據(jù)表的整體情況,必須要通過一些方法來獲得數(shù)據(jù)表的關(guān)鍵信息。數(shù)據(jù)表檢查的另一個目的是了解數(shù)據(jù)的概況,例如整個數(shù)據(jù)表的大小,所占空間,數(shù)據(jù)格式,是否有空值和重復(fù)項和具體的數(shù)據(jù)內(nèi)容。為后面的清洗和預(yù)處理做好準(zhǔn)備。 數(shù)據(jù)維度#查看數(shù)據(jù)表的維度
df.shape
(6, 6) 數(shù)據(jù)表信息#數(shù)據(jù)表信息
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 6 columns):
id 6 non-null int64
date 6 non-null datetime64[ns]
city 6 non-null object
category 6 non-null object
age 6 non-null int64
price 4 non-null float64
dtypes: datetime64[ns](1), float64(1), int64(2), object(2)
memory usage: 368.0+ bytes 查看數(shù)據(jù)格式#查看數(shù)據(jù)表各列格式
df.dtypes
id int64
date datetime64[ns]
city object
category object
age int64
price float64
dtype: object
#查看單列格式
df['B'].dtype
dtype('int64') 查看空值Isnull是Python中檢驗空值的函數(shù),返回的結(jié)果是邏輯值,包含空值返回True,不包含則返回False??梢詫φ麄€數(shù)據(jù)表進(jìn)行檢查,也可以單獨對某一列進(jìn)行空值檢查。 #檢查數(shù)據(jù)空值
df.isnull() #檢查特定列空值
df['price'].isnull()
0 False
1 True
2 False
3 False
4 True
5 False
Name: price, dtype: bool 查看唯一值 (刪除重復(fù)項)#查看city列中的唯一值
df['city'].unique()
array(['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '], dtype=object) 查看數(shù)據(jù)表數(shù)值#查看數(shù)據(jù)表的值
df.values
array([[1001, Timestamp('2013-01-02 00:00:00'), 'Beijing ', '100-A', 23,
1200.0],
[1002, Timestamp('2013-01-03 00:00:00'), 'SH', '100-B', 44, nan],
[1003, Timestamp('2013-01-04 00:00:00'), ' guangzhou ', '110-A', 54,
2133.0],
[1004, Timestamp('2013-01-05 00:00:00'), 'Shenzhen', '110-C', 32,
5433.0],
[1005, Timestamp('2013-01-06 00:00:00'), 'shanghai', '210-A', 34,
nan],
[1006, Timestamp('2013-01-07 00:00:00'), 'BEIJING ', '130-F', 32,
4432.0]], dtype=object) 查看列名稱#查看列名稱
df.columns
Index(['id', 'date', 'city', 'category', 'age', 'price'], dtype='object') 查看前10行數(shù)據(jù)#查看前3行數(shù)據(jù)
df.head(3) 查看后10行數(shù)據(jù)#查看最后3行
df.tail(3) 數(shù)據(jù)表清洗處理空值#刪除數(shù)據(jù)表中含有空值的行
df.dropna(how='any') #使用數(shù)字0填充數(shù)據(jù)表中空值
df.fillna(value=0) #使用數(shù)字0填充數(shù)據(jù)表中空值
df.fillna(value=0) #使用price均值對NA進(jìn)行填充
df['price'].fillna(df['price'].mean())
0 1200.0
1 3299.5
2 2133.0
3 5433.0
4 3299.5
5 4432.0
Name: price, dtype: float64 清理空格#清除city字段中的字符空格
df['city']=df['city'].map(str.strip) 大小寫轉(zhuǎn)換#city列大小寫轉(zhuǎn)換
df['city']=df['city'].str.lower() 更改數(shù)據(jù)格式#更改數(shù)據(jù)格式
df['price'].astype('int')
0 1200
1 3299
2 2133
3 5433
4 3299
5 4432
Name: price, dtype: int32 更改列名稱#更改列名稱
df.rename(columns={'category': 'category-size'}) 刪除重復(fù)值#刪除后出現(xiàn)的重復(fù)值
df['city'].drop_duplicates()
0 beijing
1 sh
2 guangzhou
3 shenzhen
4 shanghai
Name: city, dtype: object #刪除先出現(xiàn)的重復(fù)值
df['city'].drop_duplicates(keep='last')
1 sh
2 guangzhou
3 shenzhen
4 shanghai
5 beijing
Name: city, dtype: objec 數(shù)值修改及替換#數(shù)據(jù)替換
df['city'].replace('sh', 'shanghai') 數(shù)據(jù)預(yù)處理數(shù)據(jù)表合并首先是對不同的數(shù)據(jù)表進(jìn)行合并,我們這里創(chuàng)建一個新的數(shù)據(jù)表df1,并將df和df1兩個數(shù)據(jù)表進(jìn)行合并。在Excel中沒有直接完成數(shù)據(jù)表合并的功能,可以通過VLOOKUP函數(shù)分步實現(xiàn)。在python中可以通過merge函數(shù)一次性實現(xiàn)。下面建立df1數(shù)據(jù)表,用于和df數(shù)據(jù)表進(jìn)行合并。 #數(shù)據(jù)表匹配合并,inner模式
df_inner=pd.merge(df,df1,how='inner')
#其他數(shù)據(jù)表匹配模式
df_left=pd.merge(df,df1,how='left')
df_right=pd.merge(df,df1,how='right')
df_outer=pd.merge(df,df1,how='outer') 設(shè)置索引列#設(shè)置索引列
df_inner.set_index('id') 排序(按索引,按數(shù)值)#按特定列的值排序
df_inner.sort_values(by=['age']) #按索引列排序
df_inner.sort_index() 數(shù)據(jù)分組(vlookup)Excel中可以通過VLOOKUP函數(shù)進(jìn)行近似匹配來完成對數(shù)值的分組,或者使用“數(shù)據(jù)透視表”來完成分組。相應(yīng)的 python中使用where函數(shù)完成數(shù)據(jù)分組。 #如果price列的值>3000,group列顯示high,否則顯示low
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low') #對復(fù)合多個條件的數(shù)據(jù)進(jìn)行分組標(biāo)記
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1 數(shù)據(jù)分列(對字段拆分)#對category字段的值依次進(jìn)行分列,并創(chuàng)建數(shù)據(jù)表,索引值為df_inner的索引列,列名稱為category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']) #將完成分列后的數(shù)據(jù)表與原df_inner數(shù)據(jù)表進(jìn)行匹配
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True) 數(shù)據(jù)提取按標(biāo)簽提取(loc)#按索引提取單行的數(shù)值
df_inner.loc[3]
id 1004
date 2013-01-05 00:00:00
city shenzhen
category 110-C
age 32
price 5433
gender female
m-point 40
pay Y
group high
sign NaN
category_1 110
size C
Name: 3, dtype: object 使用冒號可以限定提取數(shù)據(jù)的范圍,冒號前面為開始的標(biāo)簽值,后面為結(jié)束的標(biāo)簽值。下面提取了0到5的數(shù)據(jù)行。 #按索引提取區(qū)域行數(shù)值
df_inner.loc[0:5] Reset_index函數(shù)用于恢復(fù)索引,這里我們重新將date字段的日期設(shè)置為數(shù)據(jù)表的索引,并按日期進(jìn)行數(shù)據(jù)提取。 #重設(shè)索引
df_inner.reset_index() #設(shè)置日期為索引
df_inner=df_inner.set_index('date') 使用冒號限定提取數(shù)據(jù)的范圍,冒號前面為空表示從0開始。提取所有2013年1月4日以前的數(shù)據(jù)。 #提取4日之前的所有數(shù)據(jù)
df_inner[:'2013-01-04'] 按位置提取(iloc)使用iloc函數(shù)按位置對數(shù)據(jù)表中的數(shù)據(jù)進(jìn)行提取,這里冒號前后的數(shù)字不再是索引的標(biāo)簽名稱,而是數(shù)據(jù)所在的位置,從0開始。 #使用iloc按位置區(qū)域提取數(shù)據(jù)
df_inner.iloc[:3,:2] iloc函數(shù)除了可以按區(qū)域提取數(shù)據(jù),還可以按位置逐條提取,前面方括號中的0,2,5表示數(shù)據(jù)所在行的位置,后面方括號中的數(shù)表示所在列的位置。 #使用iloc按位置單獨提取數(shù)據(jù)
df_inner.iloc[[0,2,5],[4,5]] 按標(biāo)簽和位置提取(ix)ix是loc和iloc的混合,既能按索引標(biāo)簽提取,也能按位置進(jìn)行數(shù)據(jù)提取。下面代碼中行的位置按索引日期設(shè)置,列按位置設(shè)置。 #使用ix按索引標(biāo)簽和位置混合提取數(shù)據(jù)
df_inner.ix[:'2013-01-03',:4] 按條件提取(區(qū)域和條件值)除了按標(biāo)簽和位置提起數(shù)據(jù)以外,還可以按具體的條件進(jìn)行數(shù)據(jù)。下面使用loc和isin兩個函數(shù)配合使用,按指定條件對數(shù)據(jù)進(jìn)行提取。 使用isin函數(shù)對city中的值是否為beijing進(jìn)行判斷。 #判斷city列的值是否為beijing
df_inner['city'].isin(['beijing'])
date
2013-01-02 True
2013-01-05 False
2013-01-07 True
2013-01-06 False
2013-01-03 False
2013-01-04 False
Name: city, dtype: bool 將isin函數(shù)嵌套到loc的數(shù)據(jù)提取函數(shù)中,將判斷結(jié)果為Ture數(shù)據(jù)提取出來。這里我們把判斷條件改為city值是否為beijing和 shanghai。如果是就把這條數(shù)據(jù)提取出來。 #先判斷city列里是否包含beijing和shanghai,然后將復(fù)合條件的數(shù)據(jù)提取出來。
df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] 數(shù)值提取還可以完成類似數(shù)據(jù)分列的工作,從合并的數(shù)值中提取出制定的數(shù)值。 category=df_inner['category']
0 100-A
3 110-C
5 130-F
4 210-A
1 100-B
2 110-A
Name: category, dtype: object
#提取前三個字符,并生成數(shù)據(jù)表
pd.DataFrame(category.str[:3]) 數(shù)據(jù)篩選使用與,或,非三個條件配合大于,小于和等于對數(shù)據(jù)進(jìn)行篩選,并進(jìn)行計數(shù)和求和。與excel中的篩選功能和countifs和sumifs功能相似。 按條件篩選(與,或,非)#使用“與”條件進(jìn)行篩選
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']] #使用“或”條件篩選
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort(['age']) 在前面的代碼后增加price字段以及sum函數(shù),按篩選后的結(jié)果將price字段值進(jìn)行求和,相當(dāng)于excel中sumifs的功能。 #對篩選后的數(shù)據(jù)按price字段進(jìn)行求和
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'),
['id','city','age','category','gender','price']].sort(['age']).price.sum()
19796 #使用“非”條件進(jìn)行篩選
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']) 在前面的代碼后面增加city列,并使用count函數(shù)進(jìn)行計數(shù)。相當(dāng)于excel中的countifs函數(shù)的功能。 #對篩選后的數(shù)據(jù)按city列進(jìn)行計數(shù)
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count()
4 還有一種篩選的方式是用query函數(shù)。下面是具體的代碼和篩選結(jié)果。 #使用query函數(shù)進(jìn)行篩選
df_inner.query('city == ["beijing", "shanghai"]') 在前面的代碼后增加price字段和sum函數(shù)。對篩選后的price字段進(jìn)行求和,相當(dāng)于excel中的sumifs函數(shù)的功能。 #對篩選后的結(jié)果按price進(jìn)行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()
12230 數(shù)據(jù)匯總Excel中使用分類匯總和數(shù)據(jù)透視可以按特定維度對數(shù)據(jù)進(jìn)行匯總,python中使用的主要函數(shù)是groupby和pivot_table。下面分別介紹這兩個函數(shù)的使用方法。 分類匯總Groupby是進(jìn)行分類匯總的函數(shù),使用方法很簡單,制定要分組的列名稱就可以,也可以同時制定多個列名稱,groupby按列名稱出現(xiàn)的順序進(jìn)行分組。同時要制定分組后的匯總方式,常見的是計數(shù)和求和兩種。 #對所有列進(jìn)行計數(shù)匯總
df_inner.groupby('city').count() #對特定的ID列進(jìn)行計數(shù)匯總
df_inner.groupby('city')['id'].count()
city
beijing 2
guangzhou 1
shanghai 2
shenzhen 1
Name: id, dtype: int64 #對兩個字段進(jìn)行匯總計數(shù)
df_inner.groupby(['city','size'])['id'].count()
city size
beijing A 1
F 1
guangzhou A 1
shanghai A 1
B 1
shenzhen C 1
Name: id, dtype: int64 除了計數(shù)和求和外,還可以對匯總后的數(shù)據(jù)同時按多個維度進(jìn)行計算,下面的代碼中按城市對price字段進(jìn)行匯總,并分別計算price的數(shù)量,總金額和平均金額。 #對city字段進(jìn)行匯總并計算price的合計和均值。
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean]) 數(shù)據(jù)透視Excel中的插入目錄下提供“數(shù)據(jù)透視表”功能對數(shù)據(jù)表按特定維度進(jìn)行匯總。Python中也提供了數(shù)據(jù)透視表功能。通過pivot_table函數(shù)實現(xiàn)同樣的效果。 數(shù)據(jù)透視表也是常用的一種數(shù)據(jù)分類匯總方式,并且功能上比groupby要強大一些。下面的代碼中設(shè)定city為行字段,size為列字段,price為值字段。分別計算price的數(shù)量和金額并且按行與列進(jìn)行匯總。 #數(shù)據(jù)透視表
pd.pivot_table(df_inner,index=["city"],values=["price"],columns=["size"],aggfunc=[len,np.sum],fill_value=0,margins=True) 數(shù)據(jù)統(tǒng)計數(shù)據(jù)采樣Python通過sample函數(shù)完成數(shù)據(jù)采樣。 #簡單的數(shù)據(jù)采樣
df_inner.sample(n=3) Weights參數(shù)是采樣的權(quán)重,通過設(shè)置不同的權(quán)重可以更改采樣的結(jié)果,權(quán)重高的數(shù)據(jù)將更有希望被選中。這里手動設(shè)置6條數(shù)據(jù)的權(quán)重值。將前面4個設(shè)置為0,后面兩個分別設(shè)置為0.5。 #手動設(shè)置采樣權(quán)重
weights = [0, 0, 0, 0, 0.5, 0.5]
f_inner.sample(n=2, weights=weights) #采樣后不放回
df_inner.sample(n=6, replace=False) #采樣后放回
df_inner.sample(n=6, replace=True) 描述統(tǒng)計Python中可以通過Describe對數(shù)據(jù)進(jìn)行描述統(tǒng)計。 Describe函數(shù)是進(jìn)行描述統(tǒng)計的函數(shù),自動生成數(shù)據(jù)的數(shù)量,均值,標(biāo)準(zhǔn)差等數(shù)據(jù)。下面的代碼中對數(shù)據(jù)表進(jìn)行描述統(tǒng)計,并使用round函數(shù)設(shè)置結(jié)果顯示的小數(shù)位。并對結(jié)果數(shù)據(jù)進(jìn)行轉(zhuǎn)置。 #數(shù)據(jù)表描述性統(tǒng)計
df_inner.describe().round(2).T 標(biāo)準(zhǔn)差Python中的Std函數(shù)用來接算特定數(shù)據(jù)列的標(biāo)準(zhǔn)差。 #標(biāo)準(zhǔn)差
df_inner['price'].std()
1523.3516556155596 協(xié)方差Excel中的數(shù)據(jù)分析功能中提供協(xié)方差的計算,python中通過cov函數(shù)計算兩個字段或數(shù)據(jù)表中各字段間的協(xié)方差。 Cov函數(shù)用來計算兩個字段間的協(xié)方差,可以只對特定字段進(jìn)行計算,也可以對整個數(shù)據(jù)表中各個列之間進(jìn)行計算。 #兩個字段間的協(xié)方差
df_inner['price'].cov(df_inner['m-point'])
17263.200000000001
#數(shù)據(jù)表中所有字段間的協(xié)方差
df_inner.cov() 相關(guān)分析Excel的數(shù)據(jù)分析功能中提供了相關(guān)系數(shù)的計算功能,python中則通過corr函數(shù)完成相關(guān)分析的操作,并返回相關(guān)系數(shù)。 Corr函數(shù)用來計算數(shù)據(jù)間的相關(guān)系數(shù),可以單獨對特定數(shù)據(jù)進(jìn)行計算,也可以對整個數(shù)據(jù)表中各個列進(jìn)行計算。相關(guān)系數(shù)在-1到1之間,接近1為正相關(guān),接近-1為負(fù)相關(guān),0為不相關(guān)。 #相關(guān)性分析
df_inner['price'].corr(df_inner['m-point'])
0.77466555617085264
#數(shù)據(jù)表相關(guān)性分析
df_inner.corr() 數(shù)據(jù)輸出處理和分析完的數(shù)據(jù)可以輸出為xlsx格式和csv格式。 寫入excel#輸出到excel格式
df_inner.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc') 寫入csv#輸出到CSV格式
df_inner.to_csv('excel_to_python.csv') 在數(shù)據(jù)處理的過程中,大部分基礎(chǔ)工作是重復(fù)和機(jī)械的,對于這部分基礎(chǔ)工作,我們可以使用自定義函數(shù)進(jìn)行自動化。以下簡單介紹對數(shù)據(jù)表信息獲取自動化處理。 #創(chuàng)建數(shù)據(jù)表
df = pd.DataFrame({"id":[1001,1002,1003,1004,1005,1006],
"date":pd.date_range('20130102', periods=6),
"city":['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age":[23,44,54,32,34,32],
"category":['100-A','100-B','110-A','110-C','210-A','130-F'],
"price":[1200,np.nan,2133,5433,np.nan,4432]},
columns =['id','date','city','category','age','price'])
#創(chuàng)建自定義函數(shù)
def table_info(x):
shape=x.shape
types=x.dtypes
colums=x.columns
print("數(shù)據(jù)維度(行,列):\n",shape)
print("數(shù)據(jù)格式:\n",types)
print("列名稱:\n",colums)
#調(diào)用自定義函數(shù)獲取df數(shù)據(jù)表信息并輸出結(jié)果
table_info(df)
數(shù)據(jù)維度(行,列):
(6, 6)
數(shù)據(jù)格式:
id int64
date datetime64[ns]
city object
category object
age int64
price float64
dtype: object
列名稱:
Index(['id', 'date', 'city', 'category', 'age', 'price'], dtype='object') 參考
|