pandas

pandas引入约定

from pandas import Series,DataFrame
import pandas as pd

Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的,相当于竖着的数组

通过一维数组创建

arr=np.array([1,3,5,np.NaN,10])
ser01=Series(arr)
print(ser01)
print(ser01.index)#打印索引
print(ser01.values)#打印值

 结果:

0 1.0
1 3.0
2 5.0
3 NaN
4 10.0
dtype: float64
RangeIndex(start=0, stop=5, step=1)
[ 1. 3. 5. nan 10.]

通过字典创建

dict={
    'name':'xxd',
    'age':26,
    'sex':'W'
}
ser01=Series(dict)
print(ser01)

 

结果:

age 26
name xxd
sex W

指定索引:默认索引是0-n-1

ser01=Series([87,90,89])
ser01.index=['语文','数学','英语']#第一种方式
ser02=Series(data=[99,89,88],dtype=np.float32,index=['语文','数学','英语'])#第二种方式
print(ser01)
print(ser02)

结果:

语文 87
数学 90
英语 89
dtype: int64

语文 99.0
数学 89.0
英语 88.0
dtype: float32

修改索引:本来就有的数据不变,没有的值为空就是NaN

ser01=Series([87,90,89])
ser01.index=['语文','数学','英语']
print('修改前的数据:')
print(ser01)
new_index=['数学','英语','Chinese','Math','English']
ser02=Series(ser01,index=new_index)
print()
print('修改后的数据')
print(ser02)

 

结果:

修改前的数据:
语文 87
数学 90
英语 89
dtype: int64

修改后的数据
数学 90.0
英语 89.0
Chinese NaN
Math NaN
English NaN
dtype: float64

Series值的获取:numpy中绝大多数操作都可以在Series中使用

ser01=Series({
    '20170801':5,
    '20170802':4,
    '20170803':3,
    '20170804':-1,
})
print(ser01)
print()
print(ser01[ser01>3])
print()
print(ser01/1000)
print()
print(np.exp(ser01))
print()
print(np.fabs(ser01))

 

结果: 

20170801 5
20170802 4
20170803 3
20170804 -1
dtype: int64

 

20170801 5
20170802 4
dtype: int64

 

20170801 0.005
20170802 0.004
20170803 0.003
20170804 -0.001
dtype: float64

 

20170801 148.413159
20170802 54.598150
20170803 20.085537
20170804 0.367879
dtype: float64

 

20170801 5.0
20170802 4.0
20170803 3.0
20170804 1.0
dtype: float64

isnull和notnull函数:返回bool值,isnull判断是否为空,notnull判断是否不为空

ser=({
    'Jack':45,
    'Tom':34
})
new_index=['Jack','Curry','Jad','Tom']
ser=Series(ser,index=new_index)
print('原始数据:')
print(ser)
print()
print('找出空数据:')
print(pd.isnull(ser))
print()
print('找不有数据的bool值:')
print(pd.notnull(ser))
print()
print('找出空数据的项:')
print(ser[pd.isnull(ser)])
print()
print('找出不是空数据的项:')
print(ser[pd.notnull(ser)])

 原始数据:

Jack 45.0
Curry NaN
Jad NaN
Tom 34.0
dtype: float64

找出空数据:
Jack False
Curry True
Jad True
Tom False
dtype: bool

找不有数据的bool值:
Jack True
Curry False
Jad False
Tom True
dtype: bool

找出空数据的项:
Curry NaN
Jad NaN
dtype: float64

找出不是空数据的项:
Jack 45.0
Tom 34.0
dtype: float64

Series自动对齐:当多个series对象之间进行运算的时候,如果不同series之间具有不同的索引值,那么运算会自动对齐不同索引值的数据,如果某个series没有某个索引值,那么最终结果会赋值为NaN

ser01=Series([1,2,3,4],index=['p1','p2','p3','p4'])
ser02=Series([2,3,4,5],index=['p2','p3','p4','p5'])
print(ser01+ser02)

p1 NaN

p2 4.0
p3 6.0
p4 8.0
p5 NaN
dtype: float64

Series及其索引的name属性:Series对象本身以及索引都具有一个name属性,默认为空,根据需要可以进行赋值操作

ser=Series({
    'Tom':87,
    'Jack':99,
    'Curry':100
})
ser.name='语文成绩'
ser.index.name='姓名'
print(ser)

 姓名

Curry 100
Jack 99
Tom 87
Name: 语文成绩, dtype: int64

 

DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典

DataFrame通过二维数组创建

#方式一:
# df01=DataFrame([['Tom','Gerry','John'],[76,98,65]])
# print(df01)
# print('-'*20)
#方式二:
# arr=np.array([
#     ['Tom',76],
#     ['Gerry',98],
#     ['John',65]
# ])
# df02=DataFrame(arr,index=['one','two','three'],columns=['name','score'])
# print(df02)
# print(df02.index)
# print(df02.columns)
# print(df02.values)
# print('-'*20)
#通过字典的方式创建
#顺序是按照字母顺序排的
#只有一个值的表明所有列都是这个数据
# data={
#     'apart':['101','102','103','101'],
#     'profiits':[587.1,125.2,12.2,23.5],
#     'year':[2001,2005,2010,2015],
#     'month':8
# }
# df03=DataFrame(data)
# df03.index=['one','two','three','four']#重置行索引
# print(df03)
# print('-'*20)

'''
DataFrame数据获取
df[列名]:获取列
df.ix[行名]:获取行
'''
# data={
#     'apart':['101','102','103','101'],
#     'profiits':[587.1,125.2,12.2,23.5],
#     'year':[2001,2005,2010,2015],
#     'month':8
# }
# df=DataFrame(data)
# df.index=['one','two','three','four']
# print(df['year'])
# print(df.ix['two'])
# df['month']=[5,6,7,8]#修改值
# df['pdn']=np.NAN#新增列
# df.ix['five']=np.NAN#新增行
# print(df)

'''
pandas:数据文件读取
'''
# #读取csv文件
# df=pd.read_csv('data1.csv')
# print(df)
# #读取文本数据
# #指定属性分隔符为':',不读取头部数据
# df01=pd.read_csv('data3.txt',sep=':',header=None)
# print(df01)
# #将df转换存储到data4csv中
# df.to_csv('data4.csv')
# #将df转换存储到data5.txt中
# df.to_csv('data5.txt',sep=':',header=None)

'''
数据过滤获取
'''
# df=pd.read_csv('data3.txt',sep=':',header=None)
# columns=['name','age','chinese','math','English']
# df.columns=columns
# print(df)
# print(df[columns[2:]])#读取第二列及以后列的数据
#print(df)

'''
缺省值NaN处理方法
'''
# df=DataFrame([
#     ['Tom',np.NAN,456.67,'M'],
#     ['Merry',34,345.56,np.NAN],
#     ['Gerry',np.NAN,np.NAN,np.NAN],
#     ['John',23,np.nan,'M'],
#     ['Joe',18,385.12,'F']
# ],columns=['name','age','salary','gender'])
# print(df)
# print(df.isnull())#返回布尔值类型
# print(df.notnull())#返回布尔值类型
# #默认丢弃只要包含缺失值的行
# # how='all'全为缺失值才去掉若为any表示有一个就去掉
# #axis=1按列去掉
# print(df.dropna(how='any',axis=1))
# #将缺失值全部填充为0
# print(df.fillna(0))
# #将指定列填充成指定数字
# print(df.fillna({'name':0.5,'age':-1,3:1}))

'''
pandas:常用的数学统计方法
'''
# df=pd.read_csv('data3.txt',sep=':',header=None)
# columns=['name','age','语文','数学','英语']
# df.columns=columns
# df=df[columns[2:]]
# print(df)
# #查看df的统计信息
# print(df.describe())

'''
协方差:如果有x,y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积
,再对这每时刻的乘积求和并求出均值。
如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高,否则...

相关系数差不多就是多除以一个标准差
'''
# df=pd.DataFrame({
#     'GDP':[900,1000,1100,1200,1300],
#     'foreign_trade':[300,400,500,550,600],
#     'year':['2012','2013','2014','2015','2016']
# })
# #交互求协方差
# print(df.cov())
# #指定求协方差
# print(df['GDP'].cov(df['foreign_trade']))
# #交互求相关系数
# print(df.corr())
# #指定求相关系数
# print(df['GDP'].corr(df['foreign_trade']))

'''
唯一值、值计数以及成员资格
'''
ser=Series(['a','b','c','d','a','b'])
print(ser)
#对ser进行去重操作
print(ser.unique())
#值计数,ascending=False就是倒叙排
print(ser.value_counts())
#查看b c在不在里面,在的话打印出来
mask=ser.isin(['b','c'])
print(ser[mask])


df=DataFrame({
    'ordef_id':['1001','1002','1003','1004','1005'],
    'member_id':['m01','m01','m02','m01','m01'],
    'order_amt':[345,312.2,123,250.2,235]
})
#只能对Series进行去重,不能直接对DataFrame去重
print(df['member_id'].unique())

 层次索引

data=pd.Series([100,200,122,150,180],
               index=[
                   ['2016','2016','2016','2017','2017'],
                   ['苹果','香蕉','西瓜','苹果','西瓜']
               ])
print(data)
print(data['2016'])
print(data[:,'西瓜'])

 2016 苹果 100

香蕉 200

西瓜 122
2017 苹果 150
西瓜 180
dtype: int64
苹果 100
香蕉 200
西瓜 122
dtype: int64
2016 122
2017 180
dtype: int64

交换分层索引

data01=data.swaplevel()
print(data01)
data02=data.swaplevel().sort_index()#sort_index()可以自动进行排序
print(data02)

苹果 2016 100
香蕉 2016 200
西瓜 2016 122
苹果 2017 150
西瓜 2017 180
dtype: int64
苹果 2016 100
2017 150
西瓜 2016 122
2017 180
香蕉 2016 200
dtype: int64

转变为DataFrame索引的堆:level等于几,那一列就消失在列里变为一行

data1=data.unstack(level=1)
print(data1)

苹果 西瓜 香蕉
2016 100.0 122.0 200.0
2017 150.0 180.0 NaN

变回去的形式

data2=data1.stack(level=0)
print(data2)

2016 苹果 100.0
西瓜 122.0
香蕉 200.0
2017 苹果 150.0
西瓜 180.0
dtype: float64

指定索引

df=DataFrame({
    'year':[2001,2001,2002,2002,2003],
    'fruit':['apple','banana','apple','banana','apple'],
    'production':[2345,3124,5668,2532,2135],
    'profits':[233.44,4452.2,1225.2,7845.2,2352.2]
})
print(df)
df=df.set_index(['year','fruit'])
print(df)
print(df.ix[2001,'apple'])#进行索引

 

fruit production profits year
0 apple 2345 233.44 2001
1 banana 3124 4452.20 2001
2 apple 5668 1225.20 2002
3 banana 2532 7845.20 2002
4 apple 2135 2352.20 2003
production profits
year fruit
2001 apple 2345 233.44
banana 3124 4452.20
2002 apple 5668 1225.20
banana 2532 7845.20
2003 apple 2135 2352.20

production 2345.00
profits 233.44
Name: (2001, apple), dtype: float64

进行统计

print(df.sum(level='year'))#进行统计
print(df.mean(level='fruit'))
print(df.min(level=['year','fruit']))

 

year
2001 5469 4685.64
2002 8200 9070.40
2003 2135 2352.20
production profits
fruit
apple 3382.666667 1270.28
banana 2828.000000 6148.70
production profits
year fruit
2001 apple 2345 233.44
banana 3124 4452.20
2002 apple 5668 1225.20
banana 2532 7845.20
2003 apple 2135 2352.20

posted @ 2018-01-23 21:43  安公子  阅读(230)  评论(0编辑  收藏  举报