字符串离散化实例
目的:将列 Genre 通过逗号分割,最终以所有的可能出现的值位列,统计某行(电影)数据,是否出现该分类,最终统计每个分类的电影的数量和
# 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() #[[],[],[]]
genre_list = list(set([i for j in temp_list for i in j]))
#构造全为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.bar(range(len(_x)),_y,width=0.4,color="orange")
plt.xticks(range(len(_x)),_x)
plt.show()
数据合并
# join: 按照行索引合并(value 相加),out 行数 = df1 行数,列增加,缺失则 NaN
out = df1.join(df2)
# merge: 按照某个列索引合并
# 内连接(默认):并集,当 df1 和 df2 某列的值相等时候才输出
out = df1.merge(df2, on=column0)
out = df1.merge(df2, on=column0, how="inner")
# 外连接:交集,df1 df2 一个有一个没有则补充 NaN
out = df1.merge(df2, on=column0, how="outer")
# 左联:df1 df2 所有列都保留,左边为准,
out = df1.merge(df2, on=column0, how="left")
# 右脸:df1 df2 所有列都保留,右边为准
out = df1.merge(df2, on=column0, how="left")
分组
# 按照列进行分组
# 返回 DataFrameGroupBy
# 每一个元素是二元组(索引(分组的值), 分组后的 DataFrame)
grouped = df.groupby(by=column0)
# 求均值返回 索引到均值
out = grouped.mean()
# 统计所有组的数量
count = grouped.count()
# 按照 column0 统计所有的数量,column0 是 df 的 column
countSeries = grouped[column0].count()
# 取出某个 group 的数量
out = countSeries[group]
# 支持多个条件分组
# 联合主键形式
grouped = df.groupby(by=[column0, column1])
# 某几列进行分组,注意 by 需要再次取列 返回 Series
series = df[column0].groupby(by=[df[column0], df[column1]]).count()
# 某几列进行分组,注意 by 需要再次取列 返回 DataFrame
# 以下三种等效
grouped1 = df[["Brand"]].groupby(by=[df["Country"],df["State/Province"]]).count()
grouped2= df.groupby(by=[df["Country"],df["State/Province"]])[["Brand"]].count()
grouped3 = df.groupby(by=[df["Country"],df["State/Province"]]).count()[["Brand"]]
索引
# 获取index
df.index
# 指定index
df.index = ['x','y']
# 重新设置index
# 不存的索引整行填充 NaN
df.reindex(list("abcedf"))
# 指定某一列作为index
# drop = True 则 column 会删除
df.set_index("Country",drop=False)
# 返回index的唯一值(去重)
df.set_index("Country").index.unique()
# 多索引
df.set_index([column0, column1]).index.unique()
Series 复合索引例子
# 建立多索引
df.set_index([column0, column1])
# 只考虑 column2 列
[column2]
# Series 的复合索引可以直接取,此时当做 Series 用
[column0value, column1value]
df.set_index([column0, column1])
# 只考虑 column2 列
[column2]
# 两个索引,可以交换索引
.swaplevel()
# Series 的复合索引可以直接取,此时当做 Series 用
[column1value]
# series 复合索引例子
DataFrame 复合索引例子
dfi = df.set_index([column0, column1])
# 建立 DataFrame 复合索引
[[column2]]
# 取指定 column 值,两者等效
dfi.loc[column0].loc[column1]
dfi.swaplevel().loc[column1]