目录
numpy能处理一些数值了,并且能用matplotlib 分析了,但是一些数据为字符串,时间序列呢
还有爬虫爬到的数据库里的内容等情况
所以pandas还能处理其他数据
pandas 数据分类
series一维,带标签数组
DataFrame二维,series 容器
series的三种方式
# 方式一:
t=pd.Series(range(10),index=list(string.ascii_uppercase[:10])) #写index自定制索引,注:不能超过26 index数量必须和前面的数量一致【 A 0 B 1 C 2】
print(type(t)) #<class 'pandas.core.series.Series'>
# 方式二:
a={string.ascii_uppercase[i]:i for i in range(6)}
t2=pd.Series(a)
print(t2)
# 方式三: 通过上述方法指定新的索引,则是通过索引取值,娶不到为Nan
t3=pd.Series(a,index=list(string.ascii_uppercase[5:11]))
#F 5.0
# G NaN
# H NaN
# I NaN
# J NaN
#因为NAN 为float 类型所以全部都变了
索引取值
t3[0] #F 5.0
t2["F"] #5.0
t[2:10:2] #挎着取
t[[2,3,5]] #取三个指定索引
t[t>6] #取值大于5的
t[["xxx"]] # Nan 取不到为Nan
t.index #取出所有的索引 Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')
t.values #取出所有的zhi array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
#np.argmax(np.array(values)) 可以使用np 的一些方法h和clip
# t.where(t>2,1) 不符合为1
# t.where(t>2) 不符合为NAN
pandas 从各种应用读取数据(datafram)
import pandas as pd
data=pd.read_csv("./qq.csv") # 可以读取各种东西
print(data)
# 7749 552 334 991
# 0 281 40 300 104
# 1 537 620 1305 18
# 2 1359 1040 361 14
# 3 1305 18 1305 18
DataFrame /DataFrame的描述信息
方式一:
import pandas as pd
a={"one":{"A":2,"B":3},"two":{"A":3,"B":4}}
t1=pd.DataFrame(a)
print(t1)
方式二:
df=pd.read_csv("./qq.csv") # 可以读取各种东西
方式三:
pd.DataFrame(np.arange(40).reshape(10,4),index=list(string.ascii_uppercase[:10]),columns=list("abcd")) #不能为单纯的字符串
df.columns #列索引
df.index #RangeIndex(start=0, stop=9, step=1)
df.shape#形状
df.dtypes #每一列的数值类型
df.ndim #维度 #2
df.values # 返回numpy的array 数组
df.head(5) #显示头部几行
df.tail(5) #显示尾部几行
df.info()#查看datafarom 的信息
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 9 entries, 0 to 8
# Data columns (total 4 columns):
# 浏览 9 non-null int64
# 点赞 9 non-null int64
# 踩 9 non-null int64
# 评论 9 non-null object
df.describe() #计数,均值,标准差,最小值,1/4位数,1/2位数 3/4位数 最大值
# 浏览 点赞 踩
# count 9.000000 9.000000 9.000000
# mean 1642.888889 496.888889 659.111111
# std 2338.391886 464.338358 484.993156
# min 281.000000 18.000000 300.000000
# 25% 537.000000 40.000000 334.000000
# 50% 1305.000000 552.000000 361.000000
# 75% 1359.000000 1040.000000 1305.000000
# max 7749.000000 1040.000000 1305.000000
#排序
df.sort_values(by="浏览",ascending=True) #默认升序 ,ascending 升序,关后可以变为降序
#第一个为列,第二个为行 和serice相反
df[:1]#取第一行
df["列名"]
loc(索引值取值) 和iloc(按索引取值)
import numpy as np
t3=pd.DataFrame(np.arange(40).reshape(10,4),index=list(string.ascii_uppercase[:10]),columns=list("abcd"))
t3.loc["A","a"]
t3.loc["A",["a","b"]] #A 行 a,b列 他是一个series
# a 0
# b 1
t3.loc["A":,["a","b"]] #A 行开始 所有的a,b列
t3.loc["A":"C","a":] #A 行开始~C行 所有的a后面的列
#t3.iloc[2] 第2行
# t3.iloc[:,2] #第二列
# t3.iloc[:,[2,1]] 索引2列居然能和1列互换位置
t3.iloc[[0,2],[2,1]] #不想讲了 自己十八
t3.iloc[[0,2],[2,1]] =0 #这个区间全部变0 T3
print(t3)
t3.iloc[[0,2],[2,1]] =np.nan #这个区间全部变0 变为浮点型
print(t3)
bool索引
t3[(t3["c"]>18)&(t3["c"]<30)] # 如果像要多个条件筛选 那就要 df[ tiaojian and tiaojian ]
t3[df["c"].str.len()>4] #可以判断字符串长度
#字符串 其他方法见表
# df["评论"].str.split("|") #转为series 使用to_list()则为转为列表
缺省数据的处理
1中是 NAN 一种是0
看哪种 比如电话号码缺失的话 改为0 没意义
又比如有些0有意义不能变为nan
处理缺省
# 找出缺省的处理
df=pd.read_csv("./qq2.csv")
print( pd.isnull(df)) #筛选出是nan
df[pd.isnull(df["评论"])] #找出有nan的哪一行
# 方式二:
df.dropna(axis=0,how="all",inplace=False) #剔除全部有nan那一行 inplace 设为True后就原地剔除了
df.dropna(axis=0,how="any",inplace=False)# 剔除有nan的那一行 inplace 设为True后就原地剔除了
#方式三:
df.fillna(0) #是nan的变为0
df.fillna(0) #是nan的变为0
df.mean() #每一列的平均值
df["评论"]=df["评论"].fillna(df["评论"].mean()) #df评论中的所有nan都替换成均值
常用统计方法
#常见方法统计
# df["two"].mean()
# daoyan_list=df["two"].str.split(",").tolist() #找出导演列表那一列,然后求出列表
# daoyan_num=len(set(daoyan_list)) #求长度
#电影时常最大值最小值
df=pd.DataFrame(a)
df["two"].max() #最大电影时常
df["two"].idxmax() #最大值索引 这种方法适合series
df["two"].median() #中值
DataFrame 使用时间序列
重采样:
t.resample("M").mean() #按照月分采样求均值
# import numpy as np
# import pandas as pd
# df=pd.read_csv(r"C:\Users\xzq\PycharmProjects\untitled18\数组\tpy.csv")
# x=(pd.to_datetime(df["时间"],format="")) #就可以把有事件措那一列 作为seise 返回
# # x=pd.date_range("20180102","20181102",periods=3) #返回一个DatetimeIndex periods分组
#
# # print(df["time"] )
# df["time"]=x
# df.set_index("time",inplace=True)
#
#
#
# print(df.resample("M").count()) #按照月统计 #属于6月的个数
# print(df.resample("10").count()) #按照10天
#