机器学习-数据科学库 06 数据的合并和分组

本文介绍如何使用Python的pandas库实现字符串离散化处理,即将文本数据转换为数值型数据,便于后续的数据分析与挖掘。文章通过具体实例展示了如何对电影类型数据进行处理,并统计每种类型的电影数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串离散化实例

目的:将列 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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值