Pandas Ⅱ

Type
Lecture
算是pandas的进阶内容。

sort_values

简单根据某列值排序
( babynames.query('Sex == "M" and Year == 2020') .sort_values("Count", ascending = False) )
根据某列的某些函数排序,例如列属性值字符串的长度等,
( babynames.query('Sex == "M" and Year == 2020') .sort_values(by="Name", key = lambda x: x.str.len(), ascending = False) )

Adding, Modifying, and Removing Columns

  • 添加或者修改一列直接 babynames["new_column_nam"]= 。 常用的 map函数,如下:
    • def dr_ea_count(string): return string.count('dr') + string.count('ea') babynames["dr_ea_count"] = babynames["Name"].map(dr_ea_count)
  • 删除一列可以babynames = babynames.drop("name_lengths", axis = 'columns'),此处通过 axis = 'columns' 来指定删除的是列!

Groupby

.groupby返回的是多组,数据类型为DataFrameGroupBy,其每一组都是一个DataFrame,所以可以 通过for 循环来遍历每一个分组,但是不推荐。实践中,最常用的需求是在每一组中做一些操作得到一行,然后把每一组中的一行再组成一个新的DataFrame。
.agg是把每一组都合并为一行且组成一个新的DataFrame,至于按照什么逻辑来合并,视其函数而定。通常,内置函数sum,min,max等均可以,关键是清楚对某一分组下的某列数据做什么操作。
👉
.groupby有三个关键参数需要牢记:按照什么聚合,聚合之后对那列来计算,执行什么计算。对应到code上就是 df.groupby([按照这些列聚合])[[聚合之后对这些列来计算]].agg(执行的具体计算函数)。例如rtp_table = female_babynames.groupby("Name")[["Count"]].agg(ratio_to_peak)
notion imagenotion image
当然,一些内置的agg函数也可以省略agg,即 :
female_babynames.groupby("Name")[["Count"]].agg(sum) # 可以写作 female_babynames.groupby("Name")[["Count"]].sum()
通常,groupby 之后,如果不指定需要计算的列,或者指定了多个计算的列,那么这些列计算的结果是独立的,例如下图中, 数字列和字母列就是单独各自计算了最大,导致生成的每一行可能并不在原先的数据中出现
notion imagenotion image
那现在如果想要按照某一列的结果来选取行呢?即 不是合并,而是分组后,按照某一列的值来选取特定的一行。
# 法 1 elections_sorted_by_percent = elections.sort_values("%", ascending=False) elections_sorted_by_percent.groupby("Party").agg(lambda x : x.iloc[0]) # 法 2 best_per_party = elections.loc[elections.groupby('Party')['%'].idxmax()] # 法 3 best_per_party2 = elections.sort_values('%').drop_duplicates(['Party'], keep='last')
将groupby操作应用到 DataFrame之后,得到一个 DataFrameGroupBy 对象,通过该对象,有多总方式可以得到一个 FataFrame,例如:
  • agg: Creates a new DataFrame with one aggregated row per subframe.
  • max: Creates a new DataFrame aggregated using the max function.
  • size: Creates a new Series with the size of each subframe.
  • filter: Creates a copy of the original DataFrame, but keeping only rows from subframes that obey the provided condition.
其实最常用的无非是 agg 与 filter,agg上面讲过了,现在来看 filter.
filter 的参数是一个函数f, 该函数的参数为每一个分组后的子DataFrame,然后筛选除满足条件的组,即该filter过滤的不是行,而是组。
notion imagenotion image