上一篇:饮冰三年-人工智能-Pandas-77-Pandas 数据查询
数据准备可参考:饮冰三年-人工智能-Django淘宝拾遗-75-数据准备
一、新增数据列
1.1 直接赋值
# 1:直接赋值(将性别枚举值进行转换) df.loc[:, "gender_name"] = df["gender"].map({1: "男", 0: "女"}) print(df)View Code
id gender ... modify_time gender_name 0 7 0 ... 2022-02-11 17:16:54 女 1 8 0 ... 2022-02-11 17:16:54 女 2 9 0 ... 2022-02-11 17:16:54 女 3 10 1 ... 2022-02-11 17:16:54 男 4 11 1 ... 2022-02-11 17:16:54 男结果
1.2 df.apply
# 2:通过df.applly (判断成绩的等级) def get_socre_level(x): if x["score_total"] > 80: return "优秀" elif x["score_total"] > 60: return "及格" else: return "差" # apply传递一个series,axis=0 表示按行,axis=1 表示按列 df.loc[:, "score_level"] = df.apply(get_socre_level, axis=1) print(df.head()) # 产看各种类型的计数 print(df["score_level"].value_counts())View Code
id gender profession_id ... modify_time gender_name score_level 0 7 0 1 ... 2022-02-11 17:16:54 女 及格 1 8 0 1 ... 2022-02-11 17:16:54 女 差 2 9 0 1 ... 2022-02-11 17:16:54 女 差 3 10 1 1 ... 2022-02-11 17:16:54 男 优秀 4 11 1 1 ... 2022-02-11 17:16:54 男 及格 [5 rows x 15 columns] 差 200 优秀 180 及格 100 Name: score_level, dtype: int64结果
1.3 df.assign
# df.assign (同时添加多个新列,返回一个新对象,把成绩四分制、十分制) result = df.assign( score_4=lambda x: x["score_total"] // 25, score_10=lambda x: x["score_total"] // 10, ) print(result.head())View Code
id gender profession_id ... score_level score_4 score_10 0 7 0 1 ... 及格 3 7 1 8 0 1 ... 差 2 6 2 9 0 1 ... 差 2 5 3 10 1 1 ... 优秀 4 10 4 11 1 1 ... 及格 3 8结果
1.4 按照条件选择分组,分别赋值
# 按照条件选择分组,分别赋值。 df["性别"] = "" df.loc[df["gender"] == 0, "性别"] = "女" df.loc[df["gender"] == 1, "性别"] = "男" print(df.head()) print(df["性别"].value_counts())View Code
id gender profession_id ... gender_name score_level 性别 0 7 0 1 ... 女 及格 女 1 8 0 1 ... 女 差 女 2 9 0 1 ... 女 差 女 3 10 1 1 ... 男 优秀 男 4 11 1 1 ... 男 及格 男 [5 rows x 16 columns] 女 240 男 240 Name: 性别, dtype: int64结果
二、统计函数
1.1 汇总类统计(count:总数、mean:平均数、std:标准差、min:最小值、(25%、50%、75%):分位数、max:最大值)
print(df.describe()) print(df["score_total"].mean())View Code
id gender ... exams_version score_total count 480.000000 480.000000 ... 480.0 480.00000 mean 246.500000 0.500000 ... 1.0 67.37500 std 138.708327 0.500522 ... 0.0 28.06615 min 7.000000 0.000000 ... 1.0 5.00000 25% 126.750000 0.000000 ... 1.0 58.75000 50% 246.500000 0.500000 ... 1.0 73.50000 75% 366.250000 1.000000 ... 1.0 90.00000 max 486.000000 1.000000 ... 1.0 100.00000结果
1.2 唯一去重,类似SQL中distinct
print(df["profession_name"].unique())View Code
['经济与管理' '计算机' '文学与历史' '挖掘机']结果
1.3 按值计数,类似SQL中Group By 后求count
print(df["profession_name"].value_counts())View Code
经济与管理 120 计算机 120 文学与历史 120 挖掘机 120结果
1.4 相关系数(corr) 和 协方差(cov)
- 相关系数:衡量相似程度
- -1:两个变量变化时的反向相似度最大
- 1:两个变量变化时的正向相似度最大
- eg:两支股票是否同涨同跌?程度多大?正相关还是负相关?
- 协方差:衡量同向、反向程度
- 协方差为正:XY同向变化,值越大,同向程度越高
- 协方差为负:XY反向变化,值越小,反向程度越高
- eg:产品笑来那个波动跟哪些因素正相关、负相关 程度有多大
三、排序
Series的排序
series.sort_values(ascending=True, inplace=False)
参数说明:
ascending:默认为True,升序排列
inplace:是否修改原始的series,默认为False
sort_result = df["score_total"].sort_values()View Code
186 5 114 5 210 5 378 5 42 5 ... 147 100 279 100 159 100 135 100结果
DataFrame的排序
DataFrame.sort_values(by, ascending=True, inplace=False)
参数说明:
by:字符串或List[字符串],表示单列排序或多列排序
ascending:默认为True,升序排列
inplace:是否修改原始的DataFrame,默认为False
d1 = df.sort_values(by="score_total", ascending=False) # 单列排序 d2 = df.sort_values(by=["exams_date", "score_total"], ascending=[False, True])[["exams_date", "score_total"]] # 多列排序View Code
exams_date score_total 402 2022-03-14 5 426 2022-03-14 5 450 2022-03-14 5 474 2022-03-14 5 404 2022-03-14 9 .. ... ... 63 2022-02-11 100 69 2022-02-11 100结果
四、一个常见异常分析
报错写法
condition = df["exams_date"].astype(str).str.startswith("2022-02")
df[condition]["score_total"] = 0
报错内容
D:/studty/djangoProject/DRF/api_service/pandas_/04_a_warning.py:8: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
报错原因分析:
df[condition]["score_total"] = 0 相当于
df.get(condition).set(score_total)
第一步骤的get发出了报警
链式操作:先get后set,get得到的dataframe可能是view也可能是copy
view:原对象
copy:复制出来的新对象
解决方法
# 方法一 将get、set 的两步操作改成set的一步操作 df.loc[condition, "score_total"] = 0 # 方法二 指明用的就是copy df_month2 = df[condition].copy() df_month2["score_total"] = 0View Code