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