pandas标识更像是给数据矩阵的行列加上标识
比如一组数据
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
变成
max mean min std
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
基本知识
import numpy as np
import pandas as pd
# pandas的主要的数据结构 Series(一维)和DataFrame(矩阵)
# 一般 行标是特性 列表是样本
# index/columns=list("abcd") 等价于 index/columns=['a','b','c','d']
# Series 一维 自动添加索引值
s = pd.Series([1,2,3,64,1,np.nan])
# print(s)
dates = pd.date_range("20201123",periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d']) # index 行标 columns 列标
# DataFrame是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。
# DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。
# 另外一种生成df的方法 DataFrame里面是字典
df2 = pd.DataFrame({"a":1,
"b":pd.Timestamp("20201123"),
'c':np.array([3]*3,dtype='int32'),
'd':['word','word','text']})
# 这种方式生成时,字典的key值是列标,行标是0~n
# 这种方法能对每一列的数据进行特殊对待
print(df2.dtypes) # 可以查看每个列的数据类型
print(df2.index) # 所有行标
print(df2.columns) # 所有列标
print(df2.values) # 所有values值
print(df2.describe()) # 挺有用,描述数据方差 平均值 求和等等
print(df2.T) # 类似于numpy,翻转数据
print(df2.sort_index(axis=1,ascending=False)) # 按数据的列(axis=1)逆序(ascending=False)输出
print(df2.sort_values(by="d")) # 对数据的值排序输出
如何查找数据
# 如何查找数据
dates = pd.date_range("20201123",periods=6)
df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['a','b','c','d'])
# 下面两种方法都可以选取数据 还可以使用切片选取特定数据
print(df)
print(df['a'])
print(df["20201123":"20201125"])
# 还可以用过loc 精确寻找
# 这个方法输入的都是具体的行标列标值
print(df.loc["20201125"]) # 20201125这一行的数据
print(df.loc[:,['a','b']]) # a b 两列所有数据
print(df.loc[["20201126","20201128"],['b','c']]) # "20201126","20201128"这两行的bc列数据
# select by position : iloc 输入的是索引值
print(df.iloc[1:3,[1,3,2]]) # 前面是行 后面是列 可以切片也可以具体索引值
# 按条件筛选
print(df[df["a"] < 8]) # print(df[df.a < 8])
修改数据以及处理异常值
# pd中修改数据值,增加数据值 可以通过loc(标签)和iloc(索引值)修改
df.loc["20201128","A"] = 122
df.iloc[2,2] = 10
# 根据条件
df.B[df.C>4] = 0
# 增加新的列
df["F"] = 0
df["G"] = pd.Series([2,3,4,1,5,1],index=pd.date_range("20201126",periods=6)) # 通过Series添加,必须要index相同
# 对于缺失值的处理
# 下面三个函数如果想要效果是直接替代原始数据,加参数 inplace=Ture
# dropna() 去掉某行或者某列之后return改变后的列表
print(df.dropna(
axis=0, # axis=1(列)
how="any" # any 只要某行含nan就去掉 all某行全部是nan去掉
))
# fillna() 将nan用其他值替代
print(df.fillna(value=0))
# isnull() 判断是否存在nan return一个Ture or False的矩阵
print(df.isnull())
合并矩阵
# 矩阵串联 concatenating 简写(concat)
df1 = pd.DataFrame(np.zeros((3,4)),columns=["a","b",'c','d'])
df2 = pd.DataFrame(np.ones((3,4)),columns=["a","b",'c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=["c","d",'e','f'])
# 如果不加ignore_index,dataframe的行标和原来一样,结果就是(012301230123)
res = pd.concat([df1,df2],axis=0,ignore_index=True)
# 如果直接用concat,对于不同标签的行列合并时,一个有一个没有时,没有的哪一个用nan填充
# 加参数join 默认是‘outer’,还有'inner'只显示两种都有的(交集)
res = pd.concat([df3,df2],axis=0,ignore_index=True,join="inner")
# 参数axis=1,横向合并, .iloc[[*,*,*]] 指定索引值合并
res = pd.concat([df2,df3],axis=1).iloc[[1,2,3]]
# append 只有纵向合并没有横向合并
res = df1.append(df2.iloc[2],ignore_index=True)
# 两个有相同列标或者行标的DataFranme合并
# merging two df bt key/keys. (may be used in databass)
df1 = pd.DataFrame({'key': [1,2,3,4],
"hobby":["eat","sleep","play","happy"]})
df2 = pd.DataFrame({'key': [24,21,4,2],
"age":[21,32,41,24]})
# on 表示以哪个key作为目标合并可以为多个 如 on=['key1','key2']
# how 表示以哪种方式合并
# how的参数有['left(以'left='为基础合并)', 'right'(以'rightt='为基础合并), 'outer(内容全部显示,没有对应列填nan)', 'inner'(只显示两者都有的,默认格式)]
# indicator(默认False),将合并的记录放在新的一列,如果indicator="indicator_column",新加的那一列的列标就是“indicator_column”
res = pd.merge(left=df1,right=df2,on="key",how="outer",indicator=True)
# merge根据行标合并
df1 = pd.DataFrame({'key': [1,2,12 ,4],
"hobby":["eat","sleep","play","happy"]},
index=[1,2,2,4])
df2 = pd.DataFrame({'key': [24,21,4,2],
"age":[21,32,41,24]},
index=[2,3,4,5])
# 基本参数和上面差不多
# 在横向合并时,有相同列标时(overlapping),可以通过suffixes定义
res = pd.merge(left=df1,right=df2,left_index=True,right_index=True,how="inner",suffixes=["_boy","_girl"])
print(res)
导入导出数据和画图
# 导入 导出文件 csv excel json pickle
data = pd.read_excel("path") # 导入文件
data.pd.to_excel("path") # 导出文件
# pandas作图 直接在SerIoUs 或 DataFrame后面加 ".plot" 这是折线图 其他图形,在加".plot.scatter" 参数和plt一样
data = pd.DataFrame(np.random.randn(1000,4),
index=np.arange(1000),
columns=list("abcd"))
data = data.cumsum()
ax = data.plot.scatter(x="b",y="a",label="111")
data.plot.scatter(x="b",y="c",ax=ax,label="222",color="red")
plt.show()
20201128