pandas
groupby
In [5]: group = data.groupby("company")
将上述代码输入ipython
后,会得到一个DataFrameGroupBy
对象
转换成列表的形式后,可以看到,列表由三个元组组成,每个元组中,第一个元素是组别(这里是按照company
进行分组,所以最后分为了A
,B
,C
),第二个元素的是对应组别下的DataFrame.
In [8]: list(group) Out[8]: [('A', company salary age 3 A 20 22 6 A 23 33), ('B', company salary age 4 B 10 17 5 B 21 40 8 B 8 30), ('C', company salary age 0 C 43 35 1 C 17 25 2 C 8 30 7 C 49 19)]
总结来说,groupby
的过程就是将原有的DataFrame
按照groupby
的字段(这里是company
),划分为若干个分组DataFrame
,被分为多少个组就有多少个分组DataFrame
。所以说,在groupby
之后的一系列操作(如agg
、apply
等),均是基于子DataFrame
的操作。
agg 聚合操作
聚合操作是groupby
后常见的操作。聚合操作可以用来求和、均值、最大值、最小值等:
针对样例数据集,如果我想求不同公司员工的平均年龄和平均薪水,可以按照下方的代码进行:
data.groupby("company").agg('mean')
如果想对针对不同的列求不同的值,比如要计算不同公司员工的平均年龄以及薪水的中位数,可以利用字典进行聚合操作的指定:
data.groupby('company').agg({'salary':'median','age':'mean'})
transform
在上面的agg
中,我们学会了如何求不同公司员工的平均薪水,如果现在需要在原数据集中新增一列avg_salary
,代表员工所在的公司的平均薪水(相同公司的员工具有一样的平均薪水),该怎么实现呢?如果按照正常的步骤来计算,需要先求得不同公司的平均薪水,然后按照员工和公司的对应关系填充到对应的位置,不用transform
的话,实现代码如下:
avg_salary_dict = data.groupby('company')['salary'].mean().to_dict() data['avg_salary'] = data['company'].map(avg_salary_dict)
如果使用transform
的话,仅需要一行代码:
data['avg_salary'] = data.groupby('company')['salary'].transform('mean')
apply
对于groupby
后的apply
,以分组后的子DataFrame
作为参数传入指定函数的,基本操作单位是DataFrame
,而之前介绍的apply
的基本操作单位是Series
。还是以一个案例来介绍groupby
后的apply
用法。
假设我现在需要获取各个公司年龄最大的员工的数据,该怎么实现呢?可以用以下代码实现:
In [38]: def get_oldest_staff(x): ...: df = x.sort_values(by = 'age',ascending=True) ...: return df.iloc[-1,:] ...: In [39]: oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff) In [40]: oldest_staff Out[40]: company salary age 0 A 23 33 1 B 21 40 2 C 43 35
df.sort_values
df.sort_values('score', ascending=False, na_position='first')
na_position指排序后NaN的位置, 'first'指将NaN放在最前面.
字符串转变量
str2 = "123 sjhid dhi" list2 = str2.split() #or list2 = str2.split(" ") str3 = "www.google.com" list3 = str3.split(".")
list vs. tuple
- 相同点:
都是有序列表;
都可以使用下标索引来访问元素, 下标索引从0开始,可以进行截取,组合等
- 不同点:
元组中的元素值是不允许修改的,但我们可以对多个元组进行连接组合, 运算后会生成一个新的元组。
元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组
dict, set
- dict是一种可变容器模型,且可存储任意类型对象.
关于dict的键:
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,只有后一个值会被记住
2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行
- set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。