pandas : python data analysis lib
基于numpy 的数据分析工具,可以高效的操作大型 结 构 化 结构化 结构化的数据
数据结构:数据在计算机中的存储、组织方式
Series: 一维数组
DataFrame:二维数组
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对象
二维数组的数据结构,两个索引
数据类型,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 索引对齐
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)
#显性索引
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