pandas基础(part4)--排序/分组/合并

学习笔记,这个笔记以例子为主。
开发工具:Spyder



pandas排序

pandas有两种对DataFrame的排序方式,他们分别是按照标签与按实际值排序。

按行标签进行排序

使用sort_index()方法可以按照行/列标签对DataFrame进行排序。默认情况下,按照升序对行标签进行排序。

  • 语法
import pandas as pd
import numpy as np

# 按照行标进行排序
已排序序列 = 未排序序列.sort_index()

# 控制排序顺序(降序)
已排序序列 = 未排序序列.sort_index(ascending=False)

按列标签进行排序

若设置sort_index()的axis参数值为1,则会按照列标签进行排序。

  • 语法
import pandas as pd
import numpy as np

# 按照列标签进行排序
已排序序列 = 未排序序列.sort_index(axis = 1)

按某列值排序

像索引排序一样,sort_values()是按值排序的方法。该函数接受一个by参数,该参数的参数值为DataFrame的列名。

  • 语法
已排序序列 = 未排序序列.sort_values(by='列名')

举个例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee'],
        'age':[9, 19, 12, 15, 30],
        'weight':[8, 4, 5, 6, 10],
        'hight':[20, 35, 30, 33, 40]}

df = pd.DataFrame(data, 
                  index = ['a1', 'a2', 'a3', 'a4', 'a5'])


#按行降序排序
s01 = df.sort_index(ascending=False)
print(s01)
print('-'*20)
#按列降序排序
s02 = df.sort_index(axis = 1, ascending=False)
print(s02)
print('-'*20)
#按weight列升序排序
s03 = df.sort_values(by = 'weight')
print(s03)

结果:

    age  hight   name  weight
a5   30     40    Lee      10
a4   15     33   Jack       6
a3   12     30  Black       5
a2   19     35    Tom       4
a1    9     20    Ada       8
--------------------
    weight   name  hight  age
a1       8    Ada     20    9
a2       4    Tom     35   19
a3       5  Black     30   12
a4       6   Jack     33   15
a5      10    Lee     40   30
--------------------
    age  hight   name  weight
a2   19     35    Tom       4
a3   12     30  Black       5
a4   15     33   Jack       6
a1    9     20    Ada       8
a5   30     40    Lee      10

pandas分组

在许多情况下,我们需要将数据分为多个集合,并在每个子集上应用一些函数,来实现我们的需求。

将数据拆分成组

  • 语法
# 将df数据框按照age字段分组
print(df.groupby('age'))
# 查看分组结果
print(df.groupby('age').groups)
  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}

df = pd.DataFrame(data, 
                  index = ['a1', 'a2', 'a3', 'a4', 'a5', 
				  'a6', 'a7', 'a8', 'a9', 'a10'])


print(df.groupby('age'))
print(df.groupby('age').groups)

结果:

<pandas.core.groupby.DataFrameGroupBy object at 0x000000D589A294A8>
{7: Index(['a9'], dtype='object'), 8: Index(['a7', 'a10'], dtype='object'), 9: Index(['a1', 'a2', 'a8'], dtype='object'), 10: Index(['a3', 'a4', 'a5', 'a6'], dtype='object')}

迭代遍历分组

df.groupby()方法可以返回可迭代对象,可以使用for循环遍历。

  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}

df = pd.DataFrame(data, 
                  index = ['a1', 'a2', 'a3', 'a4', 'a5', 
				  'a6', 'a7', 'a8', 'a9', 'a10'])


for age, i in df.groupby('age'):
	print(age)
	print(i)
	print('-'*10)

结果:

7
    age   name  weight
a9    7  Green       4
----------
8
     age   name  weight
a7     8   Blue       4
a10    8  Trump       8
----------
9
    age   name  weight
a1    9    Ada       8
a2    9    Tom       4
a8    9  Peter       5
----------
10
    age    name  weight
a3   10   Black       5
a4   10    Jack       6
a5   10     Lee      10
a6   10  Yellow      10
----------

获得子分组的细节

语法就不写了,看下面的例子和注释,应该就能懂。

  • 例子

代码:

import pandas as pd

data = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}

df = pd.DataFrame(data, 
                  index = ['a1', 'a2', 'a3', 'a4', 'a5', 
				  'a6', 'a7', 'a8', 'a9', 'a10'])

# 将df数据框按照age字段分组
grouped = df.groupby('age')
#查看age=8的分组的细节
print(grouped.get_group(8))

结果:

     age   name  weight
a7     8   Blue       4
a10    8  Trump       8

分组聚合

聚合函数为每个分组返回聚合值。当创建了分组(groupby)对象,就可以对每个分组数据执行求和、求标准差等操作。

语法就不写了,看下面的例子和注释,应该就能懂。

  • 例子

代码:

import numpy as np
import pandas as pd

datas = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}

df = pd.DataFrame(datas, 
                  index = ['a1', 'a2', 'a3', 'a4', 'a5', 
				  'a6', 'a7', 'a8', 'a9', 'a10'])


grouped = df.groupby('age')
#print(grouped)
#求出各个分组的均值
print (grouped.agg(np.mean))
print('-'*15)
#求出各个分组的加总与标准差
print(grouped.agg([np.sum, np.std]))
print('-'*15)
#使用匿名函数lambda对各个分组进行操作
print(grouped.agg(lambda x: np.sum(x**2)))

结果:

       weight
age          
7    4.000000
8    6.000000
9    5.666667
10   7.750000
---------------
    weight          
       sum       std
age                 
7        4       NaN
8       12  2.828427
9       17  2.081666
10      31  2.629956
---------------
     weight
age        
7        16
8        80
9       105
10      261

合并

Pandas提供了merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口。

合并两个DataFrame

  • 语法
# 合并两个DataFrame(默认为内连接)
rs = pd.merge(left,right)
  • 例子

代码:

import pandas as pd

leftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],
        'Bunny_ld':[1, 2, 3, 4, 2, 4, 3, 1, 4, 1]}

rightD = {'Bunny_ld':[1, 2, 3, 4],
         'foods':['A', 'B', 'C', 'D']}



df_leftD = pd.DataFrame(leftD)
df_rightD = pd.DataFrame(rightD)

rs = pd.merge(df_leftD, df_rightD)
print(rs)

结果:

   Bunny_ld  age    name  weight foods
0         1    9     Ada       8     A
1         1    9   Peter       5     A
2         1    8   Trump       8     A
3         2    9     Tom       4     B
4         2   10     Lee      10     B
5         3   10   Black       5     C
6         3    8    Blue       4     C
7         4   10    Jack       6     D
8         4   10  Yellow      10     D
9         4    7   Green       4     D

由结果可知,两个数据框,通过同样的变量Bunny_ld进行了关联,合成了一个数据框。这种连接是内连接,若df_leftD数据框的Bunny_ld字段,存在df_rightD数据框的Bunny_ld字段所没有的变量值时,则该观测行会被丢掉,同样,若df_rightD数据框的Bunny_ld字段,存在df_leftD数据框的Bunny_ld字段所没有的观测值时,该观测行也会被扔掉。
故,我们还存在左连接(左边Bunny_ld数据全保留)和右连接(右边Bunny_ld数据全保留)两种连接方式。我们可以设置merge()函数的how参数,来进行左连接/右连接。

使用how参数合并DataFrame

  • 语法
# 合并两个DataFrame(左连接)
rs = pd.merge(left,right, how = 'left')
# 合并两个DataFrame(右连接)
rs = pd.merge(left,right, how = 'right')

how的其他参数值:

合并方法 描述
left 使用左侧对象的键(左连接)
right 使用右侧对象的键(右连接)
outer 使用键的联合(外连接)
inner 使用键的交集(内连接)
  • 例子(外连接)

代码:

import pandas as pd

leftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 
                'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],
        'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],
        'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],
        'Bunny_ld':[1, 2, 3, 4, 2, 4, 3, 1, 4, 5]}

rightD = {'Bunny_ld':[1, 2, 3, 4, 6],
         'foods':['A', 'B', 'C', 'D', 'E']}



df_leftD = pd.DataFrame(leftD)
df_rightD = pd.DataFrame(rightD)

rs = pd.merge(df_leftD, df_rightD, how = 'outer')
print(rs)

结果:

    Bunny_ld   age    name  weight foods
0          1   9.0     Ada     8.0     A
1          1   9.0   Peter     5.0     A
2          2   9.0     Tom     4.0     B
3          2  10.0     Lee    10.0     B
4          3  10.0   Black     5.0     C
5          3   8.0    Blue     4.0     C
6          4  10.0    Jack     6.0     D
7          4  10.0  Yellow    10.0     D
8          4   7.0   Green     4.0     D
9          5   8.0   Trump     8.0   NaN
10         6   NaN     NaN     NaN     E
发布了141 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/105231085