文章目录
为什么要学习pandas
numpy能处理数值,但是不能处理其他形式,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他形式的数据。
pandas之Series
Series 一维,带标签数组
import pandas as pd
import string
t = pd.Series([1, 23, 54, 75, 31, 5])
t1 = pd.Series([1, 34, 55, 3, 23, 1], index=list(string.ascii_uppercase[5:11]))
print(t1)
# 通过字典创建
t2 = {"name": "xiaomin", "age": 18, "tel": "2344442"}
t2 = pd.Series(t2)
print(t2)
# 取建,取值
print(t2.index)
print(t2.values)
切片索引与numpy类似
pandas读取外部数据
import pandas as pd
#pandas读取csv中的文件
df = pd.read_csv("./dogNames2.csv")
print(df[(800<df["Count_AnimalName"])|(df["Count_AnimalName"]<1000)])
读取mongo数据
# coding=utf-8
from pymongo import MongoClient
import pandas as pd
client = MongoClient()
collection = client["douban"]["tv1"]
data = collection.find()
# data = list(collection.find())
# t1 = data[0]
# t1 = pd.Series(t1)
# print(t1)
data_list = []
for i in data:
temp = {}
temp["info"]= i["info"]
temp["rating_count"] = i["rating"]["count"]
temp["rating_value"] = i["rating"]["value"]
temp["title"] = i["title"]
temp["country"] = i["tv_category"]
temp["directors"] = i["directors"]
temp["actors"] = i['actors']
data_list.append(temp)
df = pd.DataFrame(data_list)
# print(df)
#显示头几行
print(df.head(1))
# print("*"*100)
# print(df.tail(2))
#展示df的概览
# print(df.info())
# print(df.describe())
print(df["info"].str.split("/").tolist())
pandas之DataFrame
DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
通过pd.DataFrame构建DataFrame对象
通过 ndarray构建DataFrame对象
arr_obj = np.random.rand(3, 4)
print(arr_obj)
[[ 0.63142018 0.40399522 0.44070245 0.58114319]
[ 0.82655924 0.5716437 0.20031657 0.20645792]
[ 0.42643845 0.65572268 0.11973222 0.95861301]]
df_obj = pd.DataFrame(arr_obj)
print(df_obj)
print(df_obj.head(2))
# 输出
0 1 2 3
0 0.631420 0.403995 0.440702 0.581143
1 0.826559 0.571644 0.200317 0.206458
2 0.426438 0.655723 0.119732 0.958613
0 1 2 3
0 0.631420 0.403995 0.440702 0.581143
1 0.826559 0.571644 0.200317 0.206458
通过 dict 构建DataFrame对象
dic = {
"A" : 1,
"B" : pd.Timestamp("20170426"),
"C" : pd.Series(range(10, 14), dtype = "float64"),
"D" : ["Python", "Java", "C++", "C"],
"E" : np.array([3] * 4, dtype="int32"),
"F" : "ITCast"
}
df_obj2 = pd.DataFrame(dic)
print(df_obj2)
# 输出
A B C D E F
0 1 2017-04-26 10.0 Python 3 ITCast
1 1 2017-04-26 11.0 Java 3 ITCast
2 1 2017-04-26 12.0 C++ 3 ITCast
3 1 2017-04-26 13.0 C 3 ITCast
# 在DataFrame对象里找到指定的元素,先找列,再找行
print(df_obj2['D'][2])
print(df_obj2.D[2])
# 输出
# C++
# C++
# 新增加一列的数据,数据可以是和DataFrame对象的其他列运算后的数据
df_obj2["G"] = df_obj2["C"] + 10
print(df_obj2)
# 输出
A B C D E F G
0 1 2017-04-26 10.0 Python 3 ITCast 20.0
1 1 2017-04-26 11.0 Java 3 ITCast 21.0
2 1 2017-04-26 12.0 C++ 3 ITCast 22.0
3 1 2017-04-26 13.0 C 3 ITCast 23.0
# 通过del方法,指定删除一列的数据
del(df_obj2['E'])
print(df_obj2)
# 输出
A B C D F G
0 1 2017-04-26 10.0 Python ITCast 20.0
1 1 2017-04-26 11.0 Java ITCast 21.0
2 1 2017-04-26 12.0 C++ ITCast 22.0
3 1 2017-04-26 13.0 C ITCast 23.0
DataFrame的基础属性和整体情况查询
import pandas as pd
df = pd.read_csv(r"C:\Users\zouyo\Desktop\dogNames2.csv")
# 查看信息
print(df.head())
print(df.info())
# dataFrame的排序方法,ascending=false表示降序
df = df.sort_values(by="Count_AnimalName", ascending=False)
# 取前10行 tail()取后几行
print(df.head(10))
# pandas取行取列的注意点
# 方括号写数组,表示取行,对行进行操作
# 写字符串,表示的取列索引,对列进行操作
print(df[:20]) # 取前20个
print(df["Row_Labels"], df[:20]["Row_Labels"]) # 取Row_Labels这一列,和Row_Labels这一列的前20个
print(type(df["Row_Labels"])) # <class 'pandas.core.series.Series'>
DataFrame的索引 loc和iloc
- df.loc 通过标签索引行数据
- df.iloc 通过位置获取行数据
- loc
- iloc
- 赋值
pandas之布尔索引
例题:有一组数据,分别是狗的名字,和狗名字的使用次数,现在假如我们想找到所有的使用次数超过800小于1000的狗的名字,应该怎么选择?
df = pd.read_csv(r"C:\Users\zouyo\Desktop\dogNames2.csv")
print(df[(800 < df["Count_AnimalName"]) & (1000 > df["Count_AnimalName"])])
# 输出
# [16220 rows x 2 columns]
# Row_Labels Count_AnimalName
# 2660 CHARLIE 856
# 3251 COCO 852
# 12368 ROCKY 823
pandas之字符串方法
缺失数据(nan)的处理
对于NaN的数据,在numpy中我们处理起来比较复杂。
在pandas中我们处理起来非常容易
判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
处理方式1:删除NaN所在的行列dropna (axis=0, how=‘any’, inplace=False)
处理方式2:填充数据,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
处理为0的数据:t[t==0]=np.nan
当然并不是每次为0的数据都需要处理
计算平均值等情况,nan是不参与计算的,但是0会参与,所以当不想0参与计算,可以把0替换成nan
t1.fillna(t1.mean())
t1[“age”] = t1[“age”].fillna(t1[“age”].mean()) # 对某一列的nan值进行替换