文章数据
收藏(次)
【python数据分析】第五章 pandas入门
import pandas as pd
from pandas import Series, DataFrame # 这两个特别常用,这样引入
================================================================================
pandas的数据结构:
--------------------------------------------------------------------------------
Series: 一维数组,带有索引,创建时自动添加索引 0 到 len-1
obj = Series([1,2,3,4])
print(obj.values, ' # ', obj.index)
# 输出 [1 2 3 4] # RangeIndex(start=0, stop=4, step=1)
通过 values 和 index 属性获取其中的值和索引
--------------------------------------------------------------------------------
指定索引:
obj = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'd']), 索引的个数和数据个数不同就报错
使用索引获取值,修改值
obj['a']
obj[['a', 'c']] # 获取多个索引的值
obj['d'] = 10
obj[['a', 'c']] = 99
判断某个索引存不存在:这样就能把 Series 当成字典来使用了,索引就是key
'a' in obj
'1' in obj
能当成字典用,那么就能使用字典创建 Series: 字典的key就是索引了
sddata = {'k1':11, 'k2':22, 'k3':33, 'k4':44}
obj = pd.Series(sddata)
还能使用字典创建的时候,指定自己的索引:比如
myidx = ['k4', 'k3', 'k2', 'k5', 'k6']
obj2 = pd.Series(sddata, index=myidx)
他会使用指定的索引,按照指定的索引的顺序(排序实现了),从字典中找数据key,找不到就是NULL
obj2 输出:
k4 44.0
k3 33.0
k2 22.0
k5 NaN
k6 NaN
dtype: float64
判断是否有数据, 全局方法, 实例方法两种方式:
pd.isnull(obj2), pd.notnull(obj2),
obj2.isnull() obj.notnull()
返回还是 Series:
pd.notnull(obj2) 输出如下:
k4 True
k3 True
k2 True
k5 False
k6 False
dtype: bool
索引还能重复:
obj = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'a'])
obj['a']
输出:
a 1
a 4
dtype: int64
--------------------------------------------------------------------------------
obj + obj2 两个 series 相加, 相当于取并集,然后相同索引的value相加
--------------------------------------------------------------------------------
指定 name 属性:
obj.name = '学生数据'
obj.index.name = '学生编号'
--------------------------------------------------------------------------------
obj = pd.Series([1,2,3,4], index=['a', 'b', 'c', 'a'])
obj.index = ['i1', 'i2', 'i3', 'i4'] # 修改索引,但是长度要相同
--------------------------------------------------------------------------------
DataFrame:
表格数据,二维的,相对于数据库中的表数据
--------------------------------------------------------------------------------
数据构建
使用字典:要求 name 和 age ... 后面的数据列表必须等长,否则报错
data = {
'name': ['zs', 'ls', 'ww', 'zl', 'xx', 'yy', 'zz'],
'age':[10, 13, 11, 9, 20, 15, 10],
'score': [90, 98, 80,40, 54, 32, 78]
}
frame = pd.DataFrame(data)
frame 输出:
name age score
0 zs 10 90
1 ls 13 98
2 ww 11 80
3 zl 9 40
4 xx 20 54
5 yy 15 32
6 zz 10 78
没有指定索引,他会自动加上索引, 默认时 0 到 N-1
--------------------------------------------------------------------------------
frame.head() # 数据量太大,取前5行
--------------------------------------------------------------------------------
学生的分数要保密,好的,那就不取分数:原数据没有 addr, null 补充, 索引不喜欢,改
frame2 = pd.DataFrame(data, columns=['name', 'age', 'addr'],
index=['s1', 's2', 's3', 's4', 's5', 's6', 's7'])
frame2 输出:
name age addr
s1 zs 10 NaN
s2 ls 13 NaN
.....
--------------------------------------------------------------------------------
属性:frame2.columns
输出:Index(['name', 'age', 'addr'], dtype='object')
取出某一列,两个都可以
frame2['name']
frame2.name
frame2[['name', 'age']] # 取出多列,取一个不存在的列报错 frame2['abc'] error
取出的数据是 Series 那样的,有数据还有这个数据的索引
--------------------------------------------------------------------------------
取出某一行的完整数据:
frame2.loc['s1'] # s1 时某一行的索引, 索引不存在就报错
--------------------------------------------------------------------------------
修改数据:年龄全部+1
frame2['age'] += 1
import numpy as np
frame2['addr'] = np.arange(7) # 列表依次赋值1,2...np.arange(7) 是因为frame2中7条数据,数量不匹配报错
给指定的索引进行赋值:
addrs = pd.Series(['sh', 'bj', 'tj'], index=['s1', 's3', 's5'])
frame2['addr'] = addrs # 索引能匹配的就能修改,否则不修改
给一个不存在的列赋值,会新加上这个列,
frame2['hi'] = frame2.age == 11
不想要了,就删除了吧:
del frame2['hi']
--------------------------------------------------------------------------------
嵌套字典:
pop = {
'2001': {
'name':['zs', 'ls'],
'age':[10, 20]
},
'2002':{
'name':['ww', 'ls'],
'age':[13, 21]
}
}
frame3 = pd.DataFrame(pop)
输出:
2001 2002
name [zs, ls] [ww, ls]
age [10, 20] [13, 21]
如果嵌套,那么列还是外层的key, 内层的key变成了索引。这种 嵌套不合适,下面会好点
pop2 = {
'name': {
'2001':['zs', 'ls'],
'2002':['ww', 'ls']
},
'age':{
'2001':[10, 20],
'2002':[12, 21]
}
}
frame4 = pd.DataFrame(pop2)
frame4 输出:
name age
2001 [zs, ls] [10, 20]
2002 [ww, ls] [12, 21]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
索引是并集,NaN 填充, 长度不等长也不再是问题了,再多嵌套也行,但是不容易计算了
pop3 = {
'name': {
'2001':['zs', 'ls'],
'2002':['ww', 'ls'],
'2004':{
'xx':[1,2,3],
'yy':[4,5,6]
}
},
'age':{
'2001':[10, 20],
'2003':[12, 21, 22,23,24,25]
}
}
frame4 = pd.DataFrame(pop3)
frame4
frame4 输出:
name age
2001 [zs, ls] [10, 20]
2002 [ww, ls] NaN
2004 {'xx': [1, 2, 3], 'yy': [4, 5, 6]} NaN
2003 NaN [12, 21, 22, 23, 24, 25]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
指定索引,找到就找到,找不到,补充NaN, 多余的丢掉
frame5 = pd.DataFrame(pop3, index=['2001', '2002', 's1'])
frame5 输出:
name age
2001 [zs, ls] [10, 20]
2002 [ww, ls] NaN
s1 NaN NaN
--------------------------------------------------------------------------------
转置:
frame2.T
--------------------------------------------------------------------------------
DataFrame 的构造器的数据:
二维ndarray
数组,列表,元组组成的字典
numpy结构化数组
series组成的字典
字典组成的字典
字典或series的列表
列表或者元组组成的列表
另一个DataFrame
Numpy的MaskerArray
--------------------------------------------------------------------------------
DataFrame的属性name
frame2.index.name = '学生编号'
frame2.columns.name = '学生信息‘
--------------------------------------------------------------------------------
frame2.values #属性,或者值
frame2.index #属性
================================================================================
索引一旦创建,就不能修改了,尝试修改就会 TypeError
不可变可以使Index对象在多个数据结构之间安全共享
--------------------------------------------------------------------------------
import pandas as pd
data = {
'name': ['zs', 'ls', 'ww', 'zl', 'xx', 'yy', 'zz'],
'age':[10, 13, 11, 9, 20, 15, 10],
'score': [90, 98, 80,40, 54, 32, 78]
}
frame = pd.DataFrame(data)
frame.index[1] = 's1' # 报错 TypeError: Index does not support mutable operations
一旦有索引了,就不能修改了
Series 也是如此:
arr = pd.Series([1,2,3], index=['a1', 'a2', 'a3'])
#arr.index[0] = 's1'
--------------------------------------------------------------------------------
索引一旦创建就不能修改,因此索引可以在多个数据结构中安全使用。
所以索引最好独立出来,先传教一个索引对象,然后在不同的数据结构中使用这个索引
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
创建独立的索引:
idx = pd.Index(range(3))
idx # 输出: RangeIndex(start=0, stop=3, step=1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用独立索引:
arr = pd.Series([1,2,3], index=idx)
arr
pop = {
'name': ['zs', 'ls', 'ww'],
'age':[10, 13, 11],
'score': [90, 98, 80]
}
frame2 = pd.DataFrame(pop, index=idx)
frame2
arr.index is idx # True
frame2.index is idx # True
--------------------------------------------------------------------------------
frame2.columns # 输出: Index(['name', 'age', 'score'], dtype='object')
frame2.columns['age'] = 22 # Error 也是 Index 类型的,不能修改
--------------------------------------------------------------------------------
判断
'name' in frame2.columns
1 in frame2.index
--------------------------------------------------------------------------------
idx2 = pd.Index([4,5])
idx.append(idx2) # 产生新的 index, Int64Index([0, 1, 2, 4, 5], dtype='int64'), idx,idx2都不变
--------------------------------------------------------------------------------
index 的操作还有(方法和属性):
append 追加一个index对象,形成新的index, 原来的两个都不变
difference 差集,得到新的 index
intersection 交集
union 并集
isin 是否被包含,返回bool数组
delete 删除索引处的元素,并得到新索引
drop 删除传入的值,得到新的索引
insert 将元素插入索引处,返回新索引
is_monotonic 属性:索引是不是单独递增的
is_unique 属性:索引都是唯一
unique 属性:计算index唯一值的数组
分享
收藏
点赞人
举报
文章标签
评论列表