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之后的一系列操作(如aggapply等),均是基于子DataFrame的操作。

 

agg 聚合操作

聚合操作是groupby后常见的操作。聚合操作可以用来求和、均值、最大值、最小值等:

学习笔记: Python_元组

 

 

 针对样例数据集,如果我想求不同公司员工的平均年龄和平均薪水,可以按照下方的代码进行:

 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() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。