pandas库学习,基本使用方法

本文介绍了pandas库的基础知识,包括如何查找数据、修改数据及处理异常值、矩阵合并、数据导入导出以及使用pandas进行数据可视化的方法。适合初学者掌握pandas库的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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组成的大字典。

x = pd.DataFrame(np.arange(9).reshape((3,3)),
                index = list("abc"),
                columns = ['qwe','asd','zxc'])
# obj.reindex  将数据按照新索引序列排序
x2 = x.reindex(columns=['asd','qwe','zxc']) 
# obj.drop()  返还obj删除某行后的结果,原对象并不变化(使用inplace=True可以修改原对象),axis=1,作用于列

# 另外一种生成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"))  # 对数据的值排序输出

# 两个data的加法是并集运算,缺值出现nan,可以使用add函数,其中fill_value的值对add()中的数值进行运算
# add加法 sub减法 div除法 floordiv整除  mul乘法  pow幂次方

# apply将函数应用到行或列
f = lambda x: x.max() - x.min()
frame.apply(f,axis=1)
# apply的函数并不一定是标量也可以是带有多值的Series
def f(x):
    return pd.Series([x.max(),x.min()], index=(['max','min']))
frame.apply(f,axis=1)
# applymap 逐元素进行
f = lambda x: x+1 
frame.applymap(f)

如何查找数据

# x[:2]行选择  
# 传达单个元素或者一个列表到[]可选择列  eg:x['qwe'] 
# 如何查找数据
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"])

x.loc['b',['qwe','zxc']]  
# loc和iloc也可进行切片选择
x.iloc[0:2,:]
# 通过is_unique 来查看是否有重复标签
f = pd.DataFrame(np.random.randn(3,3),columns=list('aab'))
print(f.columns.is_unique)
f['a']

# 还可以用过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])

# 排序 sort_index ,ascending=False降序排列,默认情况下所有nan都在尾部
frame = pd.DataFrame(np.arange(16).reshape((4,4)),
                     index=list('bdac'),
                     columns = list('2415')
                    )
frame["6"] = [np.nan,4,np.nan,5]
frame.sort_index(ascending=False)
# sort_values 对一列数据排列 通过by给出列 其他列做相同变化
f = pd.DataFrame({"a":[4,2,1],"b":[1,-1,4]})
f.sort_values(by='b')

# 统计性描述
# idxmax idxmin 返还max和min的行标
# argmax argmin 返还series的行列标
# count 非nan值个数
# describe 汇总统计列表
# obj.unique() 给出obj的唯一值
# value_counts() 计算重复值出现的次数 ,可以通过apply将pd.value_counts传入检查Dataframe中重复次数
data = pd.DataFrame({'a':[1,-1,4,2,2],'b':[1,3,4,-1,1]})
data.apply(pd.value_counts).fillna(0)  # fillna(0) 将nan值替换为0
# isin() 查找数据的存在状态 返还ture/false  
data = list('sacdasdad')
obj = pd.Series(data)
mas = obj.isin(['a','s']) 
obj[mas]

修改数据以及处理异常值

# 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

pd画图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10,4),columns=list("ABCD"))

# stacked 叠加图
df.plot.bar(stacked=True)
plt.show()

# barh 横向的柱状图
df.plot.barh()
plt.show()

叠加图
横向柱状图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值