数据的合并和分组聚合

案例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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值