把字符串离散化
- 获取字符串去重后的列表
- 构造全为0的数组,columns为字符串的列表
- 给全为0的数组赋值,遍历
举个例子
# coding=utf-8
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
file_path = "./IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)
# print(df["Genre"].head(3))
# 统计分类的列表
temp_list = df["Genre"].str.split(",").tolist() # [[],[],[]]列表嵌套列表
# print(temp_list)
genre_list = list(set([i for j in temp_list for i in j]))
# print(genre_list)
# 构造全为0的数组
zeros_df = pd.DataFrame(np.zeros((df.shape[0], len(genre_list))), columns=genre_list)
# print(zeros_df)
# 给每个电影出现分类的位置赋值1
for i in range(df.shape[0]):
#zeros_df.loc[0,["Sci-fi","Mucical"]] = 1
zeros_df.loc[i, temp_list[i]] = 1
# print(zeros_df.head(3))
# 统计每个分类的电影的数量和
genre_count = zeros_df.sum(axis=0)
# print(genre_count)
# 排序
genre_count = genre_count.sort_values()
_x = genre_count.index
_y = genre_count.values
#画图
plt.figure(figsize=(20, 8), dpi=80)
plt.barh(range(len(_x)), _y, height=0.4, color="orange")
plt.yticks(range(len(_x)), _x)
plt.show()
数据合并
join
默认情况下把行索引相同的数据合并到一起
merge
按照指定的列把数据按照一定的方式合并在一起
# 内连接,交集
t1.merge(t2, on="a", how='inner')
# 外连接,并集
t1.merge(t2, on="a", how='outer')
# 以t1为准
t1.merge(t2, on="a", how='left')
# 以t2为准
t1.merge(t2, on="a", how='right')
# 当两个数组列标签不同时
t1.merge(t2, left_on="a", right_on="b", how='right')
分组和聚合
df.groupby(by="")
得到grouped对象,能够调用聚合方法,能够遍历
grouped中的每一个元素是一个元组,元组的结构(索引(分组的值),分组之后的DataFrame)
df.groupby(by="").mean()
df.groupby(by="").count()
带复合索引的DataFrame
grouped = df.groupby(by=[df["Country"],df["State/Province"]])
获取分组后的某一部分数据
df.groupby(by=["Country","State/Province"])["Country"].count()
对某几列数据进行分组
df["Country"].groupby(by=[df["Country"],df["State/Province"]]).count()
下面这两行的效果一样,与上面那行不同,这两行返回的是DataFrame类型
t1 = df[["Country"]].groupby(by=[df["Country"],df["State/Province"]]).count()
t2 = df.groupby(by=["Country","State/Province"])[["Country"]].count()
索引
获取索引
df.index
设置索引的值
df.index = ["a", "c"]
重新设置索引
df.reindex(list("abcedf"))
设置某一列为索引
df.set_index("a", drop=False)
# drop为False表示之前列充当索引的列名称依然保存
返回index的唯一值unique
df.set_index("Country").index.unique()
从复合索引中取值
Series
s1["a"]["b"]
s1["a", "b"]
比如
a = pd.DataFrame({'a': range(7),'b': range(7, 0, -1),'c':['one','one','one','two','two','two', 'two'],'d': list("hjklmno")})
DataFrame
df.loc["a"].loc["b"]
从里层索引开始选择
交换里外层索引的位置
df.swaplevel()