import numpy as np
import pandas as pd
# 一:生成数据表
# 1. 用pandas创建数据表
df3 = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006],
"date": pd.date_range("20200425", periods=6),
"city": ['Beijing ', 'SH', ' guangzhou ', 'Shenzhen', 'shanghai', 'BEIJING '],
"age": [23, 44, 54, 32, 34, 32],
"category": ['100-A', '100-B', '110-A', '110-C', '210-A', '130-F'],
"price": [1200, np.nan, 2133, 5433, np.nan, 4432]},
columns=['id', 'date', 'city', 'category', 'age', 'price'])
# 2. 将数据表写入到csv文件中
df3.to_csv("csv_data.csv", index=False) # index=False表示不写入索引,header=False表示不写入表头
# 3. 导入csv或者xlsx文件
df2 = pd.DataFrame(pd.read_excel("xlsx_data.xlsx"))
df = pd.DataFrame(pd.read_csv("csv_data.csv")) # index_col=1表示从第一列读取,不包含索引
# 二:数据表信息查看
# 1. 数据表维度查看
print(df.shape)
# 2. 数据表基本信息(维度、列名称、数据格式、所占空间等)
print(df.info())
# 3. 每一列数据的格式
print(df.dtypes)
# 4. 某一列的格式
print(df["price"].dtype)
# 5. 空值
print(df.isnull())
# 6. 查看某一列空值
print(df["price"].isnull())
# 7. 查看某一列的唯一值
print(df["age"].unique())
# 8. 查看数据表的值
print(df.values)
# 9. 查看列名称
print(df.columns)
# 10. 查看前2行数据
print(df.head(2)) # 默认查看前10行数据
# 11. 查看后两行数据
print(df.tail(2)) # 默认查看后10行数据
# 三:数据表清洗
# 1. 用数字0填充空值
df = df.fillna(value=0)
# 2. 使用列price的均值对NA进行填充
df["price"] = df["price"].fillna(df["price"].mean())
# 3. 清除city字段的字符空格
df["city"] = df["city"].map(str.strip)
# 4. 大小写转换
df["city"] = df["city"].str.lower()
# 5. 更改数据格式
print(df["price"].fillna(0).astype("int").dtype)
# 6. 更改列名称
df = df.rename(columns={"category": "category_size"})
# 7. 删除后出现的重复值
print(df["age"].drop_duplicates())
# 8.删除先出现的重复值
print(df["age"].drop_duplicates(keep="last"))
# 9. 数据替换
df["city"] = df["city"].replace("sh", "shanghai")
# 四:数据预处理
df1 = pd.DataFrame({"id": [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008],
"gender": ['male', 'female', 'male', 'female', 'male', 'female', 'male', 'female'],
"pay": ['Y', 'N', 'Y', 'Y', 'N', 'Y', 'N', 'Y'],
"m-point": [10, 12, 20, 40, 40, 40, 30, 20]
})
# 1. 数据表合并
df_inner = pd.merge(df, df1, how="inner") # 匹配合并,交集
df_left = pd.merge(df, df1, how="left") # 左外连接
df_right = pd.merge(df, df1, how="right") # 右外连接
df_outer = pd.merge(df, df1, how="outer") # 全外连接
# 2. 设置索引列
df_inner = df_inner.set_index("id")
# 3. 按照特定列的值排序
df_inner = df_inner.sort_values(by=["age"])
# 4. 按照索引列排序
df_inner = df_inner.sort_index()
# 5. 如果price列的值>3000,group列显示high,否则显示low
df_inner["group"] = np.where(df_inner["price"] > 3000, "high", "low")
# 6. 对符合多个条件的数据进行分组标记
df_inner["city"] = df_inner["city"].map(str.strip).map(str.lower).replace("sh", "shanghai")
df_inner.loc[(df_inner["city"] == "beijing") & (df_inner["price"] >= 4000), "sign"] = 1
# 7. 对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
# 此处用到了元组生成器
df_split = pd.DataFrame((x.split('-') for x in df_inner['category']), index=df_inner.index, columns=['category', 'size'])
# 8. 将完成分裂后的数据表和原df_inner数据表进行匹配
df_inner = pd.merge(df_split, df_inner, left_index=True, right_index=True)
# 五:数据提取
# 主要用到的三个函数:loc,iloc和ix,loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取
# 1. 按索引提取单行的数值
df_inner = df_inner.set_index("id")
print(df_inner.loc[0])
# 2. 按索引提取区域行数值
print(df_inner.iloc[0:3])
# 3. 重设索引
df_inner.reset_index()
# 4. 设置日期为索引
df_inner = df_inner.set_index("date")
# 5. 提取27日之前的所有数据
print(df_inner[:"2020-04-27"])
# 6. 使用iloc按位置区域提取数据
print(df_inner.iloc[0:3, 0:2])
# 7. 适应iloc按位置单独提起数据
print(df_inner.iloc[[0, 2, 5], [4, 5]])
# 8. 使用ix按索引标签和位置混合提取数据 错误的在pandas的1.0.0版本开始,移除了Series.ix and DataFrame.ix 方法 所以下面是错误的
# print(df_inner.ix[:'2020-04-23', :4]) # 2020-04-23号之前,前四列数据
# 9. 判断city列的值是否为beijing
print(df_inner["city"].str.lower().map(str.strip).isin(["beijing"]))
# 10. 判断city列里是否包含beijing和shanghai,然后将符合条件的数据提取出来
print(df_inner.loc[df_inner["city"].isin(["beijing", "shanghai"])])
# 六、数据筛选
# 使用与、或、非三个条件配合大于、小于、等于对数据进行筛选,并进行计数和求和。
# 1、使用“与”进行筛选
print(
df_inner.loc[(df_inner["age"] > 25) & (df_inner["city"] == "beijing"),
["id", "city", "age", "category", "gender"]]
)
# 2. 使用“或”进行筛选
print(
df_inner.loc[(df_inner["age"] > 25) | (df_inner["city"] == "beijing"),
["id", "city", "age", "category", "gender"]].sort_values(by=["age"], ascending=False)
)
# 3. 使用“非”条件进行筛选
print(
df_inner.loc[(df_inner["city"] != "beijing"), ["id", "city", "age", "category", "gender"]].sort_values(by=["id"])
)
# 4. 对筛选后的数据按city列进行计数
print(
df_inner.loc[(df_inner["city"] != "beijing"), ["id", "city", "age", "category", "gender"]].sort_values(by=["id"]).city.count()
)
# 5. 使用query函数进行筛选
print(
df_inner.query("city == ['beijing', 'shanghai']")
)
# 6. 对筛选后的结果按price进行求和
print(
df_inner.query("city == ['beijing', 'shanghai']").price.sum()
)
# 七、数据汇总
# 主要函数是groupby和pivote_table
# 1、对所有的列进行计数汇总
print(
df_inner.groupby("city").count()
)
# 2. 按城市对id字段进行计数
print(
df_inner.groupby("city")["id"].count()
)
# 3. 对两个字段进行汇总计数
print(
df_inner.groupby(["city", "size"])["id"].count()
)
# 4. 对city字段进行汇总,并分别计算price的合计和均值
print(
df_inner.groupby("city")["price"].agg([len, np.sum, np.mean])
)
# 九、数据输出
# 分析后的数据可以输出为xlsx格式和csv格式
# 1、写入Excel
df_inner.to_excel("xlsx_data.xlsx", sheet_name="python")
# 2、写入到CSV
df_inner.to_csv('excel_to_python.csv')
print(df_inner)