pandas库学习,基本使用方法

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

上一篇:Python基础 | pandas中dataframe的整合与形变(merge & reshape)


下一篇:3-Pandas层次化索引&拼接