饮冰三年-人工智能-Pandas-78-Pandas 新增、统计、排序

上一篇:饮冰三年-人工智能-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:541      8       0  ... 2022-02-11 17:16:542      9       0  ... 2022-02-11 17:16:543     10       1  ... 2022-02-11 17:16:544     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]
女    240240
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"] = 0
View Code

核心要诀:pandas 的 dataframe 的修改写操作,只允许在源dataframe上进行一步到位

下一篇:饮冰三年-人工智能-Pandas-79-Pandas 数据处理

posted @ 2022-09-03 15:35  逍遥小天狼  阅读(43)  评论(0编辑  收藏  举报