pandas的数据结构和数据类型

导包:import pandas as pd
创建Series对象
1.列表创建Series对象
s1 = pd.Series([1,2,3,4,5]) # index=[]也可以自定义索引
2. 元组创建Series对象
s2 = pd.Series((1,2,3,4,5)) # index=[]也可以自定义索引
3. 字典创建Series对象
s3 = pd.Series('a':1,'b':2,'c':3,'d':4) # 索引为['a','b','c','d'] 值为[1,2,3,4]
4. numpy创建Series对象
# 索引为[0,1,2,3,4] 值为[0,1,2,3,4]
# index=[]也可以自定义索引
s4 = pd.Series(np.arange(5))
常用属性
| s1.index | 获取索引列数据 |
| s1.value | 获取值数据 |
| s3[ 'b' ] | 通过索引获得对应值 2 |
| s1.sort_index(ascending=True) | 索引升序 |
| s1.sort_values(by='列名', ascending=False) | 列名降序 |
创建DataFrame对象
DataFrame:类似于二维数组或表格,既有行索引也有列索引
1.字典+列表创建DataFrame
info = {
‘name’:['a', 'b', 'c'],
'gender':['male','female','male'],
'age':[14,35,56]
}
df1 = pd.DataFrame(data=info)
2. 列表+元组创建DataFrame
info = [
('a', 'male', 85),
('b', 'female', 21),
('c','male', 54)
]
df2 = pd.DataFrame(data=info) # columns=[] 可以自定义列名
3. numpy创建DataFrame
arr1 = np.arrange(12).reshape(3,4)
df3 = pd.DateFrame(data = arr1,columns = ['a','b,'c','d'])
4. 小案例
# 生成10名同学,5门课程,成绩范围:40~100
studf = pd.DateFrame(np.ramdom.randint(40,101,(10,5))) # 包左不包右
# 修改DateFrame对象的 列名 和 索引值
column_name = ['语文','数学','英语','政治','体育']
index_name = ['同学' + str(i) for i in range(studf.shape[0])]
# 具体修改DateFrame对象 列名 和 索引值的动作
studf.columns = column_name
studf.index = index_name
# p.s. rename可以实现精准修改
studf.rename(index = {0:'同学0', 4:'同学4'}, columns = {0:'语文', 1:'数学'})
# 打印结果
print(studf)
DateFrame的基本属性
| 基本属性 | 含义 |
| .shape | 维度(行列数) |
| .index | 行索引 |
| .columns | 列名 |
| .values | 数据值 |
| .T | 转置 |
DateFrame的基本函数
| 基本函数 | 含义 |
| head(n) | 查看前n行数据 |
| tail(n) | 查看后n行数据 |
| info() | 查看df对象的详细信息 |
| describe() | 查看df对象的描述性统计信息 |
| reset_index(drop=False/True) |
重置索引列. drop=False,默认值,不删除原索引列 |
| set_index() | 重新设置索引 |
DataFrame的数据类型
| pandas数据类型 | 说明 | 对应的python类型 |
| Object | 字符串类型 | string |
| int | 整数类型 | int |
| float | 浮点数类型 | float |
| datetime | 日期时间类型 | datetime包中的datatime类型 |
| timedelta | 时间差类型 | datetime包中的timedelta类型 |
| category | 分类类型 | 无原生类型,可自定义 |
| bool | 布尔类型 | bool(True、False) |
| nan/NaN/NAN | 空值类型 | None |
Pandas基本数据操作
1. 读取数据
df = pd.read('路径')
2. 移除不需要的字段(axis=0 为列)
df.drop(columns=[列名,列名,…], axis = 0)
3. 获取元素
3.1根据行列索引获取元素,先列后行
df[列名][行索引]
3.2 结合 loc 根据 行索引 和 列名 获取元素

df.loc[行索引, 列名] #获取一行数据
df.loc[‘2018-02-27’:'2018-02-14', ['open', 'high'] ] #获取多行多列
3.3 结合 iloc 根据 行号 和 列索引 获取元素
df.iloc[行号, 列索引]
df.iloc[0:5, 0:2] # 包左不包右
4. 赋值操作
df['open'] = 23
df.low = 1 #都会将这一列全改成这个值
#效果相同,但如果字段有空格等,.的方式不行
5. 排序操作
df.sort_values(by='列名', ascending=True/False) # 根据列名升序/降序排列
# 先基于列名1降序排列,列名1中值相同的再根据列名2降序排列
df.sort_values(by=['列名1','列名2'], asending=[False,False])
df.sort_index(asending=False) # 按索引排序,默认升序
DateFrame的运算
1.算术运算
# 一列同时 加/减 一个值
df.列名.add(值) 等价 df.列名 + 值
df.列名.sub(值) 等价 df.列名 – 值
2.逻辑运算
2.1. 大于 小于 & |
df[ df.open >23 ]
df[ (df.open>23) & (df.open<24) ] # 细节:里面要用小括号
# 可以通过 query() 优化上述代码
df.query('open>23 & open<24')
2.2. 固定值的筛选 isin
df[(df.open==23.53) | (df.open==23.67)]
df.query('open==23.53 | df.open==23.67')
df.query('open in [23.53, 23.67]')
df[df.open.isin([23.53, 23.67])]
# 这三种写法等价
3.统计运算
| 统计函数 | 介绍 |
| sum() | 每列求和 |
| mean() | 每列求均值 |
| median() | 每列中位数 |
| min() | 每列最小值 |
| max() | 每列最大值 |
| mode() | 每列众数 |
| abs() | 每列绝对值 |
| prod() | 每列乘积 |
| std() | 每列标准差 |
| var() | 每列方差 |
| idxmax() | 每列最大值的索引 |
| idxmin | 每列最小值的索引 |
| cumsum() | 计算前1/2/3/…/n个数的和 |
| cummax() | 计算前1/2/3/…/n个数的最大值 |
| cummin() | 计算前1/2/3/…/n个数的最小值 |
| cumprod() | 计算前1/2/3/…/n个数的积 |
| sort_index() | 按索引排序,默认升序 |
df.sum() # 对每一列进行求和
df.列名.sum() # 对某一列进行求和
p.s. 对单个函数进行统计时,坐标轴的显示方式应遵循默认列“columns”(axis=0,默认值),针对行“index”进行指定,则需指 axis=1
4.apply自定义运算
背景:目前我们用的都是Pandas提供好的函数,例如:count(,max(),min()…
如果要传入一些自定义的逻辑,此时就需要用到 apply()函数了
格式: df.apply(自定义函数, axis=0) #0一>列,1一>行
# 例子:同时获得多列的最大值和最小值差值,如,open列和close列
思路1:分解版
# 1.1自定义函数my_func,接收某列的数据,计算该列的最大值与最小值的差
def my_func(col):
return col.max()-col.min()
# 1.2 获取到open列和close列 (下面四种写法等价)
df[['open', 'close']]
df.loc[:, ['open', 'close']]
df.iloc[:, [0,2]]
df.iloc[:,[0:3:2]]
# 1.3 通过apply函数,调用上述自定义函数,作用到指定的列
df[['open', 'close']].apply(my_func) #底层 一>把df的各列分别传入函数,计算结果。
思路2:合并版 通过lambda函数实现
df[['open', 'close']].apply(lambda col: col.max() – col.min())

