案例1:电影类型统计问题
如何对获取数据中的电影类型进行统计,并且用图像表示出来
① 电影数据类型的获取
首先需要统计有哪些电影类型。
##统计分类的列表
temp_list = df["Genre"].str.split(",").tolist() ##[[],[]]
genre_list =list(set([i for j in temp_list for i in j]))
通过使用set集合的方法可以获取不重复的列表,这里需要注意temp_list列表中的元素也是列表,是不可哈希的对象,因此需要用循环的方法进行添加。
② 对每一部电影均需要进行类型的统计
这里使用的是列表统计的方法,先创建一个行数为电影数量,列数为电影类型数的空列表。
##构造全为0的数组
zero_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
此时获得的列表全为空,接下来,针对每一部电影,若电影的标签中出现某个类型,则将空列表中该电影所在行的对应类型列赋值为1。
##给每个电源出现分类的位置赋值1
for i in range(df.shape[0]):##遍历每一部电影
zero_df.loc[i,temp_list[i]] = 1
这样就可以获取所有电影对应的电影类型。
再对列表中的各列进行求和即可。
数组合并中关于join方法的使用
join默认情况下是把行索引相同的数据合并到一起
In [1]: t2
Out[1]:
V W X Y Z
A 0.0 0.0 0.0 0.0 0.0
B 0.0 0.0 0.0 0.0 0.0
In [2]: t1
Out[2]:
0 1 2 3
A 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0
C 1.0 1.0 1.0 1.0
In [3]: t1.join(t2)
Out[3]:
0 1 2 3 V W X Y Z
A 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0
B 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0
C 1.0 1.0 1.0 1.0 NaN NaN NaN NaN NaN
In [4]: t2.join(t1)
Out[4]:
V W X Y Z 0 1 2 3
A 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
B 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
在使用join方法时,行数以前面的数组为准,如t1.join(t2),得到的结果中行数与t1相同,如果t2中不存在t1中相同的行,会赋值为NaN,如果t2中行数比t1中多,那么多出来的行不会出现在结果中。
但如果两个数组完全没有相同的行标签,那么将无法通过join方法进行合并,且被合并的数组列标签与前面的数组不能相同,即列名不能重复。
数组合并中关于merge方法的使用
merge方法按照指定的列把数据按照一定的方式合并到一起
默认操作:inner,取交集
how = "outer": 外连接,取并集
how = "left": 左边为准,NaN补全
how = "outer": 右边为准,NaN补全
感受一下:
Pandas分组和聚合的功能
grouped = df.groupby(by="columns name")
by中还可以传入列表,可以按照多个条件进行分组
grouped返回的是一个DataFrameGroupBy对象,是可迭代的
grouped中的每一个元素是一个元组,元组的第一个数是索引(分组的值),第二个数是分组后的DataFrame。
索引和复合索引:
获取index:df.index
指定index:df.index = [""]
重新设置index:df.reindex(list(""))
指定某一列作为index:df.set_index("",drop=) drop设置是否保留该列
返回index的唯一值:index.unique()
对于复合索引的情况:
##创建一个具有复合索引的数组
In [27]: t1 = pd.DataFrame(np.arange(12).reshape(3,4),columns=list("ABCD"))
In [28]: t1
Out[28]:
A B C D
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
In [29]: t1.set_index(["A","B"],drop=False)
Out[29]:
A B C D
A B
0 1 0 1 2 3
4 5 4 5 6 7
8 9 8 9 10 11
##对于复合索引的DataFrame,如何进行数据的访问
##如果数据类型为series
##此时索引即为行索引
In [30]: t2 = t1.set_index(["A","B"],drop=False)["B"]
Out[30]:
A B
0 1 1
4 5 5
8 9 9
Name: B, dtype: int32
##此时若想取A=4,B=5行的数
In [31]: t2[4,5] %% t2[4][5] t2.loc[4,5] t2.loc[4].loc[5] 均可获得相同的值
Out[31]:
5
##如果数据类型是DataFrame
##此时直接索引为列索引
In [32]: t1.set_index(["A","B"],drop=False)
Out[33]:
A B C D
A B
0 1 0 1 2 3
4 5 4 5 6 7
8 9 8 9 10 11
##如果直接取
##t1[4][5],会报错
In [34]: t1.loc[4,5] %% t1.loc[4].loc[5] 指定按照进行索引
Out[34]:
A 4
B 5
C 6
D 7
Name: (4, 5), dtype: int32
如果想从里层索引进行选择,可以通过:交换索引:df.swaplevel()的方法把里外交换
实例2:从紧急电话数据中统计不同类型的紧急情况的次数,并统计出不同月份不同类型紧急电话的次数的变化情况。
让数据输出显示所有列,不省略的方法:有利于查看数据的显示形式
import pandas as pd
import numpy as np
pd.set_option('display.max_columns',None)
file_path = "F:\\拜师培训\\基础操作\\21-数据分析资料\\数据分析资料\\day06\\code\\911.csv"
df = pd.read_csv(file_path)
##先查看数据情况
#print(df.info()) #结果发现zip和twp两个column有缺失,其他数据完整
# print(df.head(10))
#获取分类
temp_list = df["title"].str.split(": ").tolist()
type_list = list(set([i[0] for i in temp_list])) ##每个数据的第一个值为事故类型,用集合的方法进行去重
#print(type_list)
##统计分类,用空列表的方法
#zero_list = pd.DataFrame(np.zeros((len(temp_list),len(type_list))),columns=type_list)
## print(zero_list)
#for i in type_list:
# zero_list.loc[df["title"].str.contains(i),i]=1
#print(zero_list)
##另一种方法:把分类依据作为df的column添加入df中
##获取每一个数据的事故类型
temp_list = df["title"].str.split(": ").to_list() ##先获取事故种类的df,并转换成列表,此时的数据like:[[],[]]
type_array = [i[0] for i in temp_list]
cate_array = pd.DataFrame(np.array(type_array),columns=["cate"])
df["cate"] = cate_array
data_count = df.groupby(by="cate").count()["title"]
print(data_count)