python34 pandas_python 3 科学计算之pandas入门(一)

数据帧(DataFrame)的功能特点:

潜在的列是不同的类型

大小可变

标记轴(行和列)

可以对行和列执行算术运算

四.各个数据结构示例

1.Series

1)创建Series

# coding:utf-8

import pandas as pd

obj = pd.Series([1, 3, 24, 23, 8])

print(obj)

print("--"*10)

print(obj.values)

print("--"*10)

print(obj.index)

print("--"*10)

print(obj[3])

0 1

1 3

2 24

3 23

4 8dtype: int64--------------------[1 3 24 23 8]--------------------RangeIndex(start=0, stop=5, step=1)--------------------

23

2)自定义index,定义索引后,原有位置索引依然可以使用

obj = pd.Series([1, 3, 24, 23, 8],index=list("abcde"))

print(obj)

print("--"*10)

print(obj.values)

print("--"*10)

print(obj.index)

print("--"*10)

print(obj[3],obj["d"])

a 1b3c24d23e8dtype: int64--------------------[1 3 24 23 8]--------------------Index(['a', 'b', 'c', 'd', 'e'], dtype='object')--------------------

23 23

也可以重新索引,如果某个索引值当前不存在,就引入缺失值“NaN”,

obj = pd.Series([1, 3, 24, 23, 8],index=list("abcde"))

obj2=obj.reindex(['b','c','d','f','g'])

print(obj2)

print("--"*10)

print("obj:{}".format(obj.values))

print("obj2:{}".format(obj2.values))

print("--"*10)

print(obj2.index)

print("--"*10)

print(obj2[3],obj2["d"])

b 3.0c24.0d23.0f NaN

g NaN

dtype: float64--------------------obj:[1 3 24 23 8]

obj2:[3. 24. 23. nan nan]--------------------Index(['b', 'c', 'd', 'f', 'g'], dtype='object')--------------------nan23.0

对于缺失值,可以填充其他值

obj = pd.Series([1, 3, 24, 23, 8],index=list("abcde"))

obj2=obj.reindex(['b','c','d','f','g'],fill_value=0)

print(obj2)

print("--"*10)

print("obj:{}".format(obj.values))

print("obj2:{}".format(obj2.values))

print("--"*10)

print(obj2.index)

print("--"*10)

print(obj2[3],obj2["d"])

b 3c24d23f0g0dtype: int64--------------------obj:[1 3 24 23 8]

obj2:[3 24 23 0 0]--------------------Index(['b', 'c', 'd', 'f', 'g'], dtype='object')--------------------

0 23

3)使用字典创建Series,字典key会作为series的索引

dic={'calvin':7,'kobe':24,'mj':23,'kd':35}

print(pd.Series(dic))

#####

calvin7kd35kobe24mj23dtype: int64

2.DataFrame

在所有操作之前当然要先import必要的pandas库,因为pandas常与numpy一起配合使用,所以也一起import吧。对于numpy这个包后面再来写,先导入,看代码,开始这次的重点

1)直接创建,可以直接使用pandas的DataFrame函数创建,比如接下来我们随机创建一个4*4的DataFrame。上面提到过,DataFrame是二维数据结构

# coding:utf-8import pandasaspd

import numpyasnp

df1=pd.DataFrame(np.random.randn(4,4),index=list('ABCD'),columns=list('ABCD'))

print("=="*50)

print(df1)

print("=="*50)

print(df1.ndim)

print("=="*50)

print(df1.size)

print("=="*50)

print(df1.shape)

结果:

====================================================================================================A B C D

A-0.077428 1.117524 0.595675 -0.247774B0.734320 2.117861 1.531927 -0.485774C1.126023 -0.640626 0.755659 -0.651486D-0.008357 -0.582401 -0.908435 0.225568

====================================================================================================

2 #ndim查看DataFrame的"轴",轴为2,即为2维

====================================================================================================

16 #size查看DataFrame的数据量,16个数据

====================================================================================================(4, 4) #shape查看DataFrame的类型,即4行4列

其中第一个参数是存放在DataFrame里的数据,第二个参数index就是之前说的行名(或者应该叫索引?),第三个参数columns是之前说的列名。

后两个参数可以使用list输入,但是注意,这个list的长度要和DataFrame的大小匹配,不然会报错。当然,这两个参数是可选的,你可以选择不设置。

而且发现,这两个list是可以一样的,但是每行每列的名字在index或columns里要是唯一的。

2)使用字典创建,

dic1 ={'name': ['小明', '小红', '狗蛋', '铁柱'],'age': [17, 20, 5, 40],'gender': ['男', '女', '女', '男']

}

df3=pd.DataFrame(dic1,)

print(df3)

####

age gender name0 17男 小明1 20女 小红2 5女 狗蛋3 40 男 铁柱

3.DataFrame查看与筛选数据

3.1 查看列的数据类型,dtypes

df3 =pd.DataFrame(dic1,)

print(df3.dtypes)

##########

age int64

genderobjectnameobjectdtype:object

3.2 查看DataFrame的头尾head(),tail()默认都是5行

df4=pd.DataFrame(np.random.randn(6,6))

print(df4.head())

print("--"*50)

print(df4.tail(2))

#######0 1 2 3 4 5

0 1.343776 -1.279881 -1.181201 -0.396298 -1.125743 -0.611221

1 0.948905 -0.345690 -1.790776 1.020443 -1.254210 -2.217274

2 -0.528329 -0.972449 -0.851321 0.260332 -0.189709 -1.215085

3 -0.520668 1.463702 1.161444 0.734592 -0.766386 0.911954

4 -0.091497 2.277969 -0.596919 1.223075 0.701117 1.179839

----------------------------------------------------------------------------------------------------

0 1 2 3 4 5

4 -0.091497 2.277969 -0.596919 1.223075 0.701117 1.179839

5 1.274698 0.056263 -0.244694 0.841284 -0.596790 -1.340147

3.3 查看DataFrame的行名与列名df1.index、df3.columns

df1 = pd.DataFrame(np.random.randn(4, 4), index=list('abcd'), columns=list('ABCD'))

print(df1)

print("--"*50)

print(df1.index)

print(df1.columns)

######

A B C D

a0.554493 0.952188 1.506555 -0.618873b0.255190 0.357644 0.002479 -0.307104c-0.283515 0.220664 -0.458655 0.830601d-0.608960 -0.301327 0.400476 0.118921

----------------------------------------------------------------------------------------------------Index(['a', 'b', 'c', 'd'], dtype='object')

Index(['A', 'B', 'C', 'D'], dtype='object')

3.4 查看DataFrame的值, values。返回的是一个数组。

dic1 ={'name': ['小明', '小红', '狗蛋', '铁柱'],'age': [17, 20, 5, 40],'gender': ['男', '女', '女', '男']

}

df3=pd.DataFrame(dic1,)

print(df3)

print("--"*50)

print(df3.values)

#####

age gender name0 17男 小明1 20女 小红2 5女 狗蛋3 40男 铁柱----------------------------------------------------------------------------------------------------[[17 '男' '小明']

[20 '女' '小红']

[5 '女' '狗蛋']

[40 '男' '铁柱']]

查看某一列的数据

dic1 ={'name': ['小明', '小红', '狗蛋', '铁柱'],'age': [17, 20, 5, 40],'gender': ['男', '女', '女', '男']

}

df3=pd.DataFrame(dic1,)

print(df3)

print("--"*30)

print(df3["name"])

print("--"*30)

print(df3["name"].values)

######

age gender name0 17男 小明1 20女 小红2 5女 狗蛋3 40男 铁柱------------------------------------------------------------

0小明1小红2狗蛋3铁柱

Name: name, dtype:object

------------------------------------------------------------['小明' '小红' '狗蛋' '铁柱']

使用loc或者iloc查看数据值(但是好像只能根据行来查看?)。区别是loc是根据行名,iloc是根据数字索引(也就是行号)。

df1 = pd.DataFrame(np.random.randn(4, 4), index=list('abcd'), columns=list('ABCD'))

print(df1.loc["a"])-------A-0.224071B0.183044C0.769312D0.700409Name: a, dtype: float64

或者这样。

df1 = pd.DataFrame(np.random.randn(4, 4), index=list('abcd'), columns=list('ABCD'))

print(df1.iloc[0])------A-0.193388B-0.552667C0.368871D-1.143332Name: a, dtype: float64

3.5 查看行列数,shape查看行列数,参数为0表示查看行数,参数为1表示查看列数。

dic1 ={'name': ['小明', '小红', '狗蛋', '铁柱'],'age': [17, 20, 5, 40],'gender': ['男', '女', '女', '男']

}

df3=pd.DataFrame(dic1, )

print(df3)

print("--" * 50)

print("行数:{},列数:{}".format(df3.shape[0], df3.shape[1]))

print("类型:%s * %s" %df3.shape)

######

age gender name0 17男 小明1 20女 小红2 5女 狗蛋3 40男 铁柱----------------------------------------------------------------------------------------------------行数:4,列数:3类型:4 * 3

3.5 小结。

data = {'name': ['calvin', 'kobe', 'michale', 'durant', 'james'],'age': [29, 40, 56, 30, 34],'height': [1.70, 1.98, 1.98, 2.06, 2.03]} #从字典创建DataFrame

data2= [['a', 1], ['b', 2], ['c', 3]] #从列表创建DataFrame

data3= {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])} #从系列的字典来创建DataFrame

dd=pd.DataFrame(data3)

df= pd.DataFrame(data2, columns=['name', 'age']) #加入列标签

dd['three'] = pd.Series([10, 20, 30], index=['a', 'b', 'c']) #增加列

print(pd.DataFrame(data))##

age height name

029 1.70calvin1 40 1.98kobe2 56 1.98michale3 30 2.06durant4 34 2.03 james

print(df)###

name age

0 a1

1 b 2

2 c 3

print(dd)###

one two three

a1.0 1 10.0b2.0 2 20.0c3.0 3 30.0d NaN4 NaN

print(dd['one']) #列选择

###

****************************************a1.0b2.0c3.0d NaN

Name: one, dtype: float64****************************************

print(dd.loc['b']) #行选择(标签选择)

****************************************one2.0two2.0three20.0Name: b, dtype: float64****************************************

print(dd.iloc[1]) #行选择(按整数位置选择)

****************************************one2.0two2.0three20.0Name: b, dtype: float64****************************************

print(dd[0:2]) #行切片

****************************************one two three

a1.0 1 10.0b2.0 2 20.0

****************************************

下表列出了DataFrame构造函数所能接受的各种数据:

类型

说明

二维ndarray

数据矩阵,还可以传入行标和列标

由数组、列表或元组组成的字典

每个序列会变成DataFrame的一列。所有序列的长度必须相同

Numpy的结构化/记录数组

类似于“由数组组成的字典”

由Series组成的字典

每个Series会成为一列。如果没有显示指定索引,则各Series的索引会被合并成结果的行索引

由字典组成的字典

各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”的情况一样

字典或Series的列表

各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标

由列表或元组组成的列表

类似于“二维ndarray”

另一个DataFrame

该DataFrame的索引将会被沿用,除非显式指定了其他索引

Numpy的MaskedArray

类似于“二维ndarray”的情况,只是掩码值在结果DataFrame会变成NA/缺失值

五.读取Excel文件&CSV文件

新建一个测试用的Excel,命名为

test.xlsx

并加入一些数据,放入到pycharm工程目录下,数据如下图:

importpandas as pd

data=pd.read_excel("test.xlsx")print(data.head(3)) #读取前三行数据

========================================Date Open Hight Low Close Adj Close Volume

02019-10-09 50.123456 75.123456 20.123456 33.123456 43.123456 45.123456

1 2019-10-10 51.123456 76.123456 21.123456 34.123456 44.123456 46.123456

2 2019-10-11 52.123456 77.123456 22.123456 35.123456 45.123456 47.123456

========================================

print(data.tail(3)) #读取后三行数据

========================================Date Open Hight ... Close Adj Close Volume23 2019-11-01 73.123456 98.123456 ... 56.123456 66.123456 68.123456

24 2019-11-02 74.123456 99.123456 ... 57.123456 67.123456 69.123456

25 2019-11-03 75.123456 100.123456 ... 58.123456 68.123456 70.123456[3 rows x 7columns]========================================

print(data.describe()) #数据概要统计

========================================Open Hight Low Close Adj Close Volume

count26.000000 26.000000 26.000000 26.000000 26.000000 26.000000mean62.623456 87.623456 32.623456 45.623456 55.623456 57.623456std7.648529 7.648529 7.648529 7.648529 7.648529 7.648529min50.123456 75.123456 20.123456 33.123456 43.123456 45.123456

25% 56.373456 81.373456 26.373456 39.373456 49.373456 51.373456

50% 62.623456 87.623456 32.623456 45.623456 55.623456 57.623456

75% 68.873456 93.873456 38.873456 51.873456 61.873456 63.873456max75.123456 100.123456 45.123456 58.123456 68.123456 70.123456

========================================

importpandas as pdimportmatplotlib.pyplot as plt

data=pd.read_excel("test.xlsx")#使用日期做索引

dates=pd.to_datetime(data['Date'])

df=data.set_index(dates)

df.drop('Date',1,inplace=True)

df['Open'].plot()

plt.show()#显示图片

#访问某列

print(df['Close'])#切片,获取指定的行

print(df['2018-08-08':'2018-08-18'])#索引切片

print(df.loc['2018-08-09',['Open','Close']]) #两个维度切片

print(df.loc['2018-08-09','Open']) #查看2018-08-09这个日期的Open值

print(df.loc['2018-08-02':'2018-08-06','Close']) #查看2018-08-02到2018-08-06之间的Close值

print(df.loc['2018-08-04':'2018-08-08',['Open','Close']]) #查看2018-08-02到2018-08-06之间的Open值和Close值#位置切片

print(df.iloc[0,:]) #查看第一条数据

print(df.iloc[-5:,:])#获取倒数五条数据

print(df.iloc[-20:-10:4]) #步长为4,获取倒数20行到倒数10行的数据

print(df.iloc[0,0]) #获取第一条的第一个数据

print(df.at[dates[0],'Close']) #获取第一个日期的Close值

print(df[df['Open']>60]) #筛选数据,获取Open值大于60的数据

df['Fake']=pd.Series(np.random.randn(len(df)),index=dates) #增加一列数据

print(df)

df2=df.copy() #拷贝一个df2

df2[df2<0]=np.nan #小于0的全部设为NAN

print(df2)print(df.mean()) #每一列的平均值

print(df.mean(1)) #每一行的平均值

print(df.groupby(by=df.index.year).mean()) #以年分组,求各年份的平均值

print(df.sort_values(by='Open',ascending=False)) #默认升序排序,ascending=False设置降序排列

#批量迭代读取csv

data2=pd.read_csv('test.csv',iterator=True,chunksize=10000,usecols=['date'])print(data2.get_chunk(4)) #获取前四行的数据

print(data2) #显示一串字符串

for i in data2: #迭代读取csv的数据

print(i)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值