1. 程式人生 > 其它 >pandas學習筆記(1)——series和dataframe

pandas學習筆記(1)——series和dataframe

Series一維,DataFrame二維,是pandas的核心

Series的建立

方法一:用ndarray建立,傳遞一個列表或陣列
s = Series(data = np.random.randint (0,150,size = 10),index =list('abcdefghij'),name = 'python')
'''Out[4]: 
a    106
b     98
c     75
d     25
e     70
f    105
g     99
h    148
i    124
j     19
Name: python, dtype: int32
'''
#方法2:通過字典來建立(key,value)
s2 = Series({'a':110,'b':120,'c':130,'d':140})
'''
Out[5]: 
a    110
b    120
c    130
d    140
dtype: int64
'''
type(s)
'''
Out[6]: pandas.core.series.Series
'''
#索引
s[['d','e','e','f']]#這是顯式索引
'''
Out[10]: 
d     16
e    143
e    143
f     90
Name: python, dtype: int32
'''
s[[2,-1,-3,4]]#這是隱式索引
'''
Out[11]: 
c     61
j     49
h    125
e    143
Name: python, dtype: int32
'''
s.iloc[[0,2,1]]#通過隱式索引呼叫
s.loc[['a','c','c']]#通過顯式索引呼叫
#切片
s['a':'f']
s['a':'w']#索引w不存在,則從a取到末尾
s[::2]
s['b':'j':-1]#原理與numpy相同,同樣也可以加上loc或者iloc

#series的一些屬性:
s.shape() s.size() s.index() s.value()#後面這兩個返回一個ndarray
s.head(n) s.tail(n)#展示資料的前、後n個數據,預設5個

#空值的處理:
s[['b','d']] = np.NaN
'''
Out[15]: 
a     96.0
b      NaN
c     61.0
d      NaN
e    143.0
f     90.0
g    118.0
h    125.0
i     76.0
j     49.0
Name: python, dtype: float64
'''
cond = s.isnull()#查詢空資料,返回一個全是布林值的列表,為空的值是true
s[cond]#提取所有空值
cond = s.notnull()
s[cond]#提取所有非空值
#給一個series起名
s2.name = 'Math'

s2+10#效果作用在每一個元素上,廣播效果
s.add(10)#與上一行效果相同
s.add(10,fill_value = 10)#把所有NaN資料填充成10,然後再進行加法運算
s.astype(int8)#改變資料型別,只改value部分,不改index部分

#還有一些統計學函式,s.pow(2),s.std(),s.max()等等,和numpy相同
s.value_counts()#統計每個資料出現的次數
#一個例項,#統計每個型別的檔案出現次數
a = ['aaaa.mp3','bbbb.mp4','cccc.mp3','dddd.avi']
def count_(a):
    return Series([i.split('.')[-1] for i in a]).value_counts()    
count_(a)
'''
Out[17]: 
mp3    2
mp4    1
avi    1
dtype: int64
'''

datafarame***核心中的核心,非常重要,一行是一個樣本,一列是一個屬性

#建立:
df = DataFrame(data = {'python':np.random.randint(0,150,size = 5),
                       'MATH':np.random.randint(0,150,size = 5),
                       'English':np.random.randint(0,150,size = 5)},
               index = list('ABCDE'))
'''
Out[22]: 
   python  MATH  English
A      32   121       89
B      40   119      119
C     136    86      103
D      36    70      119
E      93   111      111
'''
#建立方式2:
df2 = DataFrame(data = np.random.randint(0,150,size = (5,4)),
                index = list('abcde'),
                columns = list(['python','math','english','chinese']))
'''
Out[25]: 
   python  math  english  chinese
a      90   144       35       59
b      79    52      128      119
c      61   121        8       12
d     141    96      139       17
e      75    90       46      142
'''
#檔案的儲存:下面的方法如果原檔案存在,則會將其覆蓋
df2.to_csv('C:\\Users\\shm\\Desktop\\python_data\\data\\df2.csv')
df2.to_excel('C:\\Users\\shm\\Desktop\\python_data\\data\\df2.xlsx')

#檔案的讀取:
df3 = pd.read_csv('C:\\Users\\shm\\Desktop\\python_data\\data\\df2.csv')#再讀回來索引就變成了一種屬性

'''
Out[28]: 
  Unnamed: 0  python  math  english  chinese
0          a      90   144       35       59
1          b      79    52      128      119
2          c      61   121        8       12
3          d     141    96      139       17
4          e      75    90       46      142
'''
#把第一列變成索引的方法:
df3 = df3.rename(mapper = {'Unnamed: 0':'index'},axis = 1)#axis = 0是預設值,會在行名中檢索index,所以不會有變化
df3
df3.set_index(keys = 'index')
#dataframe的一些屬性:
df.shape() df.size()等,方法與前面類似

#dataframe其實就是就是多個series組成共用一個index
#dataframe獲取某列資料的方法:
df.python 或 df['math'] df[['math','python']]
#獲取某行的方法:用.或者[]都不行,用loc

df2.loc[['a','c']]
df2.iloc[[1,2]]#與series相同

#獲取某一元素
df2['math']['b']#先列後行
df2.loc['b']['math']#先行後列
df2.loc['index','columns']

#切片
df2['a':'c']#不能直接對列切片
#列切片的唯一方法:
df2.iloc[:,1:3]

#dataframe的運算:加減乘除都有廣播效果
df2.cov() #協方差
'''
Out[48]: 
          python     math  english  chinese
python    946.20   -33.15  1260.95  -660.20
math      -33.15  1198.80 -1416.40 -1140.35
english  1260.95 -1416.40  3440.70   359.80
chinese  -660.20 -1140.35   359.80  3469.70
'''
df2.corr()#相關性係數
'''
Out[49]: 
           python      math   english   chinese
python   1.000000 -0.031126  0.698848 -0.364366
math    -0.031126  1.000000 -0.697412 -0.559138
english  0.698848 -0.697412  1.000000  0.104134
chinese -0.364366 -0.559138  0.104134  1.000000
'''
df2.describe()#很好用
'''
Out[50]: 
           python        math    english     chinese
count    5.000000    5.000000    5.00000    5.000000
mean    89.200000  100.600000   71.20000   69.800000
std     30.760364   34.623691   58.65748   58.904159
min     61.000000   52.000000    8.00000   12.000000
25%     75.000000   90.000000   35.00000   17.000000
50%     79.000000   96.000000   46.00000   59.000000
75%     90.000000  121.000000  128.00000  119.000000
max    141.000000  144.000000  139.00000  142.000000
'''

兩個資料框進行加減乘除,對應元素進行加減乘除,多餘的元素填充NaN補齊,想用別的元素補齊,用df.add(df2,fill_value = n)

#Series與dataframe之間的運算:
'''對下面這個dataframe進行操作
out[4]: 
   python  MATH  English
A     112    51       69
B     127   144      109
C      44    79       22
D     123    95      104
E      59    47       70
'''
s = df.loc['A']#取一行
df.add(s)#對每一行執行add操作,預設axis = 0或columns,每一行加上這個series,axis = 1或index對每一列遍歷相加
'''
   python  MATH  English
A     224   102      138
B     239   195      178
C     156   130       91
D     235   146      173
E     171    98      139
'''