小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【學(xué)習(xí)筆記】python實現(xiàn)excel數(shù)據(jù)處理...

 戰(zhàn)神之家 2021-10-02

概述

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]

API

Python列表腳本操作符

在這里插入圖片描述

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

概述用途

  • 不可變序列

  • 元組是以圓括號“()”包圍的數(shù)據(jù)集合,不同成員以“,”分隔

  • 與列表不同:元組中數(shù)據(jù)一旦確立就不能改變

  • 通過下標(biāo)進(jìn)行訪問

聲明方式

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

概述用途

  • 字典是另一種可變?nèi)萜髂P停铱纱鎯θ我忸愋蛯ο蟆?/p>

  • 字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中

聲明方式

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

API

series-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

array

import 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

API

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

參考

  • 【python】pandas庫Series類型與基本操作詳解

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多