pandas数据分析工具

pandas

  • 说明
  • pandas 核心数据结构
    • Series
      • 时 间 字 符 串 时间字符串 转为时间
      • 时间的减法
      • 产生日期序列
    • DataFrame
      • dataframe常用属性/方法
    • 获取列数据
    • 插入一列
    • 删除
    • DataFrame的切片
    • 合并
    • 多级索引

说明

pandas : python data analysis lib
基于numpy 的数据分析工具,可以高效的操作大型 结 构 化 结构化 的数据

pandas 核心数据结构

数据结构:数据在计算机中的存储、组织方式

Series: 一维数组
DataFrame:二维数组

Series

import pandas as pd
#通过一维数组创建
s = pd.Series([2,3,1,5],index=["a","b","c","d"])
s[0]
s[:2]
s[[0,3]]
s["a"]
#通过字典创建
s = pd.Series({
     "name":"jack","age":23,"sex":"man"})
#key is index , value is value

#通过标量
s = pd.Series(5,index=["a","b","c"])

访问的时候,可以使用隐性索引0,1,2… 分片不包括最后
也可以使用显性索引”a“,“b”,“c”… 分片包括后

也可以使用mask掩码操作 [True,False] 或者 [2,3,5,1]索引

常用属性

s.values  #一维数组
s.index   
s.shape  
s.size   
s.ndim   
s.dtype    

时 间 字 符 串 时间字符串 转为时间

#时间字符串
s = pd.Series(["2011","2020-01-01","2021/03/6","01 July 2020"])
#字符串类型object

#将时间字符串--->转为时间
s = pd.to_datetime(s)
0   2011-01-01
1   2020-01-01
2   2021-03-06
3   2020-07-01
dtype: datetime64[ns]  #精确到ns

#时间类型的Series对象的属性
s.dt.year  #Series所有时间的年
s.dt.month #所有的月
s.dt.day  #所有的日
s.dt.hour #所有的时
s.dt.minute #所有的分
s.dt.second #所有的秒
s.dt.microsecond #所有的微 秒

s.dt.week     #一年中的第几周
s.dt.weekofyear   #一年中的第几周

s.dt.dayofweek  #一周中的第几天 周一为0
s.dt.weekday  #一周中的第几天 周一为0

s.dt.dayofyear #一年中的第几天
s.dt.quarter  #第几季度

s.dt.is_month_start  #是否月的开始
s.dt.is_month_end
s.dt.is_quarter_start #是季度的开始
s.dt.is_quarter_end
s.dt.is_year_start
s.dt.is_year_end
s.dt.is_leap_year #是否闰年
s.dt.days_in_month #当前月有多少天
#

时间的减法

s = pd.Series(["2011","2020-01-01","2021/03/6","01 July 2020"])

s = pd.to_datetime(s)

#减去一个时间
delta = s - pd.to_datetime("20100203")

0    332 days
1   3619 days
2   4049 days
3   3801 days
dtype: timedelta64[ns]

delta.dt.days  #时间偏移量就一个days 属性

产生日期序列

#产生5天的日期序列
#起始日期, periods序列数,频率间隔freq
s = pd.date_range("2020-01-03",periods=5,freq="D")

DatetimeIndex(['2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06',
               '2020-01-07'],
              dtype='datetime64[ns]', freq='D')
              
s = pd.date_range("2020-01-03",periods=5,freq="M") #按照月产生五个日期序列
s = pd.date_range("2020-01-03",periods=5,freq="B") #按照工作日产生五个

#时间区间
start = "2020-02-01"
end = "2020-02-28"
s = pd.date_range(start,end)  #二月份,包含end 

pd创建一个时间
pd.datetime(2020,2,1)–> datetime.datetime对象

DataFrame

二维数组的数据结构,两个索引
数据类型,int,float,object
列之间的数据类型可以不同

import pandas as pd

#二维数组创建数据帧
data = [[1,2],[3,4],[0,2]]
df = pd.DataFrame(data,columns=["a","b"],dtype="float16")
df.index = ["r1","r2","r3"]

    a    b
0  1.0  2.0
1  3.0  4.0
2  0.0  2.0

#通过字典创建
dict_ = {
     "a":[1,2,3,],"b":[2,4,2]}
df = pd.DataFrame(dict_,dtype="object")
   a  b
0  1  2
1  2  4
2  3  2

#通过列表创建DataFrame,放入一列
dict_1 = [{
     "a":1,"b":2},{
     "a":2,"b":4}]
df = pd.DataFrame(dict_1)

#两列不一致时
data = {
     "one":pd.Series([1,2,3],index=["a","b","c"]),"two":pd.Series([3,3,2,4],index=["b","c","d","e"])}
  one  two
a  1.0  NaN
b  2.0  3.0
c  3.0  3.0
d  NaN  2.0
e  NaN  4.0

data = {
     "one":[1,2,3],"two":[3,3,2,4]}
#简单指定两个长度不一样的列表时
#报错
df = pd.DataFrame(data)
#ValueError: arrays must all be same length
#有索引时才可以  如Series  索引对齐

dataframe常用属性/方法

df.shape  # 具体形状
df.columns  # 字段属性
df.index  #索引
df.values  #数据 -->二维数组
df.ndim  #维度
df.dtypes  #每列的数据类型
df.size   #元素数
df.empty  #是否为空, 空-->True
df.head()  #开头5行
df.tail()  #结尾5行
df.info()  #统计
df.describe() #统计
df.memory_usage()  #内存使用

获取列数据

#获取一列
df["a"] -->Series
df[["a"]]  --> DataFrame

#获取多列
df[["a","b"]]
df[df.columns[:10]] #获取前 十列

#过滤选择
df.filter(items=["a","b"]) #把指定的项目选出来
df.filter(regex=r".*abc.*") #按照正则匹配
df.filter(like="tw")  #模糊查询

插入一列

df["last_col"] = pd.Series([1,2,3,4])
df["last_col"] = [1,2,3,4] #此时给列表时,一定是相同长度,否则报错

删除

#删除列
df.drop("last_col",axis=1,inplace=True)
df.drop(["c1","c2"],axis=1,inplace=True)

#删除行
df.drop([2,3,8],axis=0,inplace=True)

DataFrame的切片

#显性索引
df.loc["r1":"r3","c1":]

#隐性索引
df.iloc[0:3,2:-1]

合并

#append
df.append(df)

a  1.0  NaN
b  2.0  3.0
c  3.0  3.0
d  NaN  2.0
e  NaN  4.0
a  1.0  NaN
b  2.0  3.0
c  3.0  3.0
d  NaN  2.0
e  NaN  4.0

#concat
df = pd.concat([df1,df2],axis=0)  #在0轴拼接,列上对齐
df = pd.concat([df1,df2],axis=1)  #在1轴拼接,行索引对齐

#merge 内存级的拼接,更高效
df = pd.merge(df1,df2,how="inner",on="id1")
df = pd.merge(df1,df2,how="left",on="id2")  #on操作的是两边共同的列,left以左边的行为主
df = pd.merge(df1,df2,how="outer",left_on="id1",right_on="id2") #不是共同列是需指定左边的列,右边的列

多级索引

#均值5 标准差为2的正态分布,随机采样
data = np.random.normal(5,2,(6,3))
df = pd.DataFrame(data)

index = [("a","f"),("a","m"),("b","f"),("b","m"),("c","f"),("c","m")]
df.index = pd.MultiIndex.from_tuples(index)

cols = [("age","a"),("age","b"),("age","c")]
df.columns = pd.MultiIndex.from_tuples(cols)

         age                    
            a         b         c
a f  5.810448  3.178142  5.276857
  m  2.263627  8.751775  4.868360
b f  3.228824  2.957298  4.615817
  m  4.377531  6.678261  3.212549
c f  3.888357  3.561949  4.832612
  m  7.586076  6.209394  1.193233

多级索引访问
df.loc[“a”] --> 两行(“a”,“f”)(“a”,“m”)
df.loc[“a”,“f”] --> 一行
df.loc[ [“a”,“b”] ,“age”] —>a、b行

#获取列数据
df.age[“a”]
df[“age”][“b”]
df[“age”,“b”]

#取一行中的一列的数据
df.loc[“a”,“f”][“age”,“a”] -->5.810448

 
 
下一篇:pandas数据分析工具2

你可能感兴趣的:(数据分析,数据分析,python,pandas)