Pandas Ⅱ
算是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)

当然,一些内置的agg函数也可以省略agg,即 :
female_babynames.groupby("Name")[["Count"]].agg(sum) # 可以写作 female_babynames.groupby("Name")[["Count"]].sum()
通常,groupby 之后,如果不指定需要计算的列,或者指定了多个计算的列,那么这些列计算的结果是独立的,例如下图中, 数字列和字母列就是单独各自计算了最大,导致生成的每一行可能并不在原先的数据中出现

那现在如果想要按照某一列的结果来选取行呢?即 不是合并,而是分组后,按照某一列的值来选取特定的一行。
# 法 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过滤的不是行,而是组。
