系列文章目录:
python数据分析(一)——series和读取外部数据
python数据分析(二)——DataFrame
python数据分析(三)——pandas缺失值处理
python数据分析(四)——pandas常用统计方法
数据的合并和分组聚合
前言
对于这一组电影数据,希望统计电影分类(genre)的情况,应该如何处理数据?
思路:重新构造一个全为0的数组,列名为分类,如果某一条数据中分类出现过,就让0变为1
一、字符串离散化实例
代码如下(示例):
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.font_manager import FontProperties
font = FontProperties(fname="/System/Library/Fonts/Supplemental/Songti.ttc", size=14)
df = pd.read_csv("./IMDB-Movie-Data.csv")
temp_list = list(df["Genre"].str.split(",")) # [[], [], []]
# print(temp_list)
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", "Musical"] = 1
# loc[index, columns]第一个参数为索引,第二个参数为列
# iloc[index]只接受索引,不接受列参数
zeros_df.loc[i, temp_list[i]] = 1
# 统计每个分类的电影的数量和
genre_count = zeros_df.sum(axis=0)
# print(zeros_df)
# 排序
genre_count = genre_count.sort_values(ascending=False)
# 画图
plt.figure(figsize=(20, 8), dpi=80)
_x = genre_count.index
_y = genre_count.values
plt.bar(range(len(_x)), _y, width=0.5)
plt.xticks(range(len(_x)), _x, rotation=45, fontproperties=font)
plt.yticks(range(0, 520, 100), fontproperties=font)
plt.xlabel("种类", fontproperties=font)
plt.ylabel("数量", fontproperties=font)
plt.show()
二、数据合并join:行索引
join:默认情况下是把行行索引相同的数据合并在一起,按照对应的行索引合并
数据合并 行索引
In [18]: t1 = pd.DataFrame(np.ones((2, 4)), index=list("AB"),columns=list("abcd"))
In [19]: t1
Out[19]:
a b c d
A 1.0 1.0 1.0 1.0
B 1.0 1.0 1.0 1.0
In [20]: t2 = pd.DataFrame(np.zeros((3, 3)), index=list("ABC"),columns=list("xyz"))
In [21]: t2
Out[21]:
x y z
A 0.0 0.0 0.0
B