pandas主要有两个数据结构:series和dataframe

一、序列

import numpy as np
import pandas as pd

obj = pd.Series([2,1,4,3])
obj.values  ##序列的值
obj.index   ##序列的索引
obj[2]  
obj2 = pd.Series([4,3,5,2],index = ['a','b','c','d'])  ##给序列添加索引
obj2[['b','a']]
obj2[obj2>3]
obj2*2
np.exp(obj2)
'b' in obj2
'e' in obj2
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}  ##将字典直接传入序列
obj3 = pd.Series(sdata)   
states = ['California', 'Ohio', 'Oregon', 'Texas']   
obj4 = pd.Series(sdata, index=states)
##判断序列是否存在缺失值
pd.isnull(obj4)
pd.notnull(obj4)
obj4.isnull()

obj3 + obj4  ##序列的对齐功能
obj4.name = 'population'   ##命名
obj4.index.name = 'state'
obj4.name
obj4.index.name

二、dataframe

##dataframe
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
        'year': [2000, 2001, 2002, 2001, 2002, 2003],
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame.head()  ##查看前5行
pd.DataFrame(data,columns = ['year','state','pop'])
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
                     index=['one', 'two', 'three', 'four',
                            'five', 'six'])  #传入的列没有值会显示nan
frame2
frame2.index
frame2.columns
frame2.isnull()
pd.isnull(frame2)
pd.notnull(frame2)
frame2.year
frame2['year']
frame2.loc['three']  ##取第二行
frame2.iloc[2,:]   #取第二行
frame2['debt'] = 16.5
frame2['debt'] = np.arange(6.)
##将序列赋值传入
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val
frame2
frame2['eastern'] = frame2.state == 'Ohio'
frame2
del frame2['eastern']  ##删除列
frame2.columns

三、其他数据形式

##其他数据形式
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
      'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)  #如果嵌套字典传给DataFrame,pandas就会被解释为:外层字典的键作为列,内层键则作为行索引:
frame3 
frame3.T  ##转置

pdata = {'Ohio': frame3['Ohio'][:-1],
         'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata)
frame3.values
frame3.index
frame2.values

四、索引对象--index

dataframe中加入series python dataframe,series_bc

 

 

 五、基本功能

1.重新索引

#重新索引
obj = pd.Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
obj.reindex(['a','b','c','d'])
#对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现前向值填充
obj3 = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4]) 
obj3.reindex(range(6),method = 'ffill') ##method = ffill:向前填充

frame = pd.DataFrame(np.arange(9).reshape((3, 3)),
                     index=['a', 'c', 'd'],
                     columns=['Ohio', 'Texas', 'California'])

frame2 = frame.reindex(['a','b','c','d'])
frame2
state = ['Ohio','pop','Texas','California']
frame3 = frame2.reindex(columns = state)
frame3

2.drop

obj = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
obj
new_obj = obj.drop('c')
new_obj
obj.drop(['d', 'c'])

data = pd.DataFrame(np.arange(16).reshape((4, 4)),
                    index=['Ohio', 'Colorado', 'Utah', 'New York'],
                      columns=['one', 'two', 'three', 'four'])

data.drop(['Ohio', 'Colorado'])
data.drop('two',axis = 1)
data.drop(['two', 'four'], axis='columns')

3.索引、选取和过滤

##索引、选取、过滤
obj = pd.Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj['b']
obj[1]
obj[2:4]
obj[['b', 'a', 'd']]
obj[[1, 3]]
obj[obj < 2]
obj['b':'c']  ##利用标签的切片运算与普通的Python切片运算不同,其末端是包含的:
obj['b':'c'] = 5 
obj
data = pd.DataFrame(np.arange(16).reshape((4, 4)),
                 index=['Ohio', 'Colorado', 'Utah', 'New York'],
                   columns=['one', 'two', 'three', 'four'])
data['two']   ##选取单一列
data[['three', 'one']]  ##选取多列
data[:2]  ##选择行
data[data['three'] > 5]  ##选择多行
data[data<5] = 0  ##通过布尔型DataFrame(比如下面这个由标量比较运算得出的)进行索引
data

##使用轴标签(loc)或整数索引(iloc)
data.loc['Colorado', ['two', 'three']]
data.iloc[2, [3, 0, 1]]  #整数索引从0开始
data.iloc[2]  #第二行
data.iloc[2,3]   #第二行第三列
data.iloc[[1, 2], [3, 0, 1]]
data.loc[:'Utah', 'two']
data.iloc[:, :3][data.three > 5]

4.算术运算和数据对齐

##算术对齐
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1],
               index=['a', 'c', 'e', 'f', 'g'])
s1
s2
s1+s2  #自动的数据对齐操作在不重叠的索引处引入了NA值
df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'),
                   index=['Ohio', 'Texas', 'Colorado'])

df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),
                    index=['Utah', 'Ohio', 'Texas', 'Oregon'])
df1 + df2

df1 = pd.DataFrame({'A': [1, 2]})
df2 = pd.DataFrame({'B': [3, 4]})
df1 - df2
#在算术方法中填充值
df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)),
                  columns=list('abcd'))
df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)),
                   columns=list('abcde'))
df2.loc[1, 'b'] = np.nan
df1 + df2   ## 
df1.add(df2)  ## 会产生nan值
df1.add(df2, fill_value=0)  ##没有nan值,指定一个填充值0。
1/df1
df1.div(1)  ##df1/1
df1.rdiv(1)   ##1/df1
df1.rsub(1)   ##1-df1
df1.sub(1)    ##df1-1

df1.reindex(columns=df2.columns, fill_value=0) ##在对Series或DataFrame重新索引时,也可以指定一个填充值:

dataframe中加入series python dataframe,series_算术运算_02

 

 

 5.DataFrame和Series之间的运算

arr = np.arange(12.).reshape((3, 4))
arr
arr[0]
arr-arr[0]  ##广播
frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),
                      columns=list('bde'),
                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])

series = frame.iloc[0]
frame - series  ##DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播:
series2 = pd.Series(range(3), index=['b', 'e', 'f'])
frame + series2  ##如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集:
series3 = frame['d']
frame.sub(series3, axis='index') ##如果你希望匹配行且在列上广播,则必须使用算术运算方法。

6.函数的应用和映射

frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])
frame
np.abs(frame)

f = lambda x: x.max() - x.min()
frame.apply(f)  #各列的最大值减去最小值
frame.apply(f,axis = 'index')   ##列
frame.apply(f, axis='columns')   ##行执行


def f(x):
    return pd.Series([x.min(), x.max()], index=['min', 'max'])

frame.apply(f)  ##返回每列的多个值
frame.apply(f,axis = 'columns')    #每行

format = lambda x: '%.2f' % x   #frame中各个浮点值的格式化字符串,使用applymap即可:
frame.applymap(format)  

frame['e'].map(format)  ##之所以叫做applymap,是因为Series有一个用于应用元素级函数的map方法:
##frame.map(format)  错误

 7.排序和排名

##排序和排名
##按索引排序
obj = pd.Series(range(4),index = ['b','a','c','d'])
obj.sort_index()
obj.sort_values()
frame = pd.DataFrame(np.arange(8).reshape(2,4),index=['three', 'one'],
                     columns = ['d','a','b','a'])
frame.sort_index()    ##默认对行排序
frame.sort_index(axis = 1)  ##1是对列排序,0是对行排序
frame
frame.sort_index(axis = 1,ascending = False)  ##默认是升序,即ascending = True

#按值排序
obj = pd.Series([4, 7, np.nan,-3, 2])
obj.sort_values()   #缺失值会放在最后
frame = pd.DataFrame({'b': [4, 7, -3, 2], 'a': [0, 1, 0, 1]})
frame.sort_values(by='b',ascending = False)
frame.sort_values(by=['a', 'b'])

##rank:返回排序的序号
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank() ##默认按照平均值排序
obj.rank(method='first')  #值在原数据中出现的顺序给出排名
obj.rank(ascending=False, method='max')  #按照降序排名,返回出现的最大排名
frame = pd.DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1],
                      'c': [-2, 5, 8, -2.5]})
frame.rank(axis = 0)
frame.rank(axis = 1)

dataframe中加入series python dataframe,series_bc_03