任何分组(groupby)操作都涉及原始对象的以下操作之一。它们是 -

  • 分割对象
  • 应用一个函数
  • 结合的结果

在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数。在应用函数中,可以执行以下操作 -

  • 聚合 - 计算汇总统计
  • 转换 - 执行一些特定于组的操作
  • 过滤 - 在某些情况下丢弃数据

将数据拆分成组

Pandas对象可以分成任何对象。有多种方式来拆分对象,如 -

  • obj.groupby(‘key’)
  • obj.groupby([‘key1’,’key2’])
  • obj.groupby(key,axis=1)

聚合

聚合函数为每个组返回单个聚合值。当创建了分组(group by)对象,就可以对分组数据执行多个聚合操作。 一个比较常用的是通过聚合或等效的agg方法聚合

一次应用多个聚合函数

通过分组系列,还可以传递函数的列表或字典来进行聚合,并生成DataFrame作为输出 -

转换

分组或列上的转换返回索引大小与被分组的索引相同的对象。因此,转换应该返回与组块大小相同的结果。

过滤

过滤根据定义的标准过滤数据并返回数据的子集。filter()函数用于过滤数据

Pandas具有功能全面的高性能内存中连接操作,与SQL等关系数据库非常相似。 Pandas提供了一个单独的merge()函数,作为DataFrame对象之间所有标准数据库连接操作的入口 - pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True)

Python 连接

在这里,有以下几个参数可以使用 -

  • left - 一个DataFrame对象。
  • right - 另一个DataFrame对象。
  • on - 列(名称)连接,必须在左和右DataFrame对象中存在(找到)。
  • left_on - 左侧DataFrame中的列用作键,可以是列名或长度等于DataFrame长度的数组。
  • right_on - 来自右的DataFrame的列作为键,可以是列名或长度等于DataFrame长度的数组。
  • left_index - 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 在具有MultiIndex(分层)的DataFrame的情况下,级别的数量必须与来自右DataFrame的连接键的数量相匹配。
  • right_index - 与右DataFrame的_left_index_具有相同的用法。
  • how - 它是_left_, rightouter_以及_inner_之中的一个,默认为内_inner。 下面将介绍每种方法的用法。
  • sort - 按照字典顺序通过连接键对结果DataFrame进行排序。默认为True,设置为False时,在很多情况下大大提高性能。

合并使用“how”的参数

如何合并参数指定如何确定哪些键将被包含在结果表中。如果组合键没有出现在左侧或右侧表中,则连接表中的值将为NA。 这里是how选项和SQL等效名称的总结 -

合并方法

SQL等效

描述

left

LEFT OUTER JOIN

使用左侧对象的键

right

RIGHT OUTER JOIN

使用右侧对象的键

outer

FULL OUTER JOIN

使用键的联合

inner

INNER JOIN

使用键的交集

Pandas提供了各种工具(功能),可以轻松地将SeriesDataFramePanel对象组合在一起 pd.concat(objs,axis=0,join=‘outer’,join_axes=None, ignore_index=False)

其中,

  • objs - 这是Series,DataFrame或Panel对象的序列或映射。
  • axis - {0,1,...},默认为0,这是连接的轴。
  • join - {'inner', 'outer'},默认inner。如何处理其他轴上的索引。联合的外部和交叉的内部。
  • ignore_index − 布尔值,默认为False。如果指定为True,则不要使用连接轴上的索引值。结果轴将被标记为:0,...,n-1
  • join_axes - 这是Index对象的列表。用于其他(n-1)轴的特定索引,而不是执行内部/外部集逻辑。

代码举例

import pandas as pd
import numpy as np

ipl_data = {‘Team’: [‘Riders’, ‘Riders’, ‘Devils’, ‘Devils’, ‘Kings’,
‘kings’, ‘Kings’, ‘Kings’, ‘Riders’, ‘Royals’, ‘Royals’, ‘Riders’],
‘Rank’: [1, 2, 2, 3, 3, 4, 1, 1, 2, 4, 1, 2],
‘Year’: [2014, 2015, 2014, 2015, 2014, 2015, 2016, 2017, 2016, 2014, 2015, 2017],
‘Points’: [876, 789, 863, 673, 741, 812, 756, 788, 694, 701, 804, 690]}
df = pd.DataFrame(ipl_data)
print(df)
print(df.groupby(‘Team’))
print(df.groupby(‘Team’).groups) # 查看分组
print(df.groupby([‘Team’, ‘Year’]).groups) # 多列分组
grouped = df.groupby(‘Year’)
for name, group in grouped: # 遍历分组
print(name)
print(group)
print(grouped.get_group(2014)) # 选择分组
print(grouped[‘Points’].agg(np.mean))
print(grouped.agg(np.size))
print(“-------------------------------”)
grouped = df.groupby(‘Team’)
print(grouped[‘Points’].agg([np.sum, np.mean, np.std]))
score = lambda x: (x - x.mean()) / x.std() * 10
print(grouped.transform(score))
print(grouped.filter(lambda x: len(x) >= 3))
print(“-------------------------------------”)
left = pd.DataFrame({
‘id’: [1, 2, 3, 4, 5],
‘Name’: [‘Alex’, ‘Amy’, ‘Allen’, ‘Alice’, ‘Ayoung’],
‘subject_id’: [‘sub1’, ‘sub2’, ‘sub4’, ‘sub6’, ‘sub5’]})
right = pd.DataFrame(
{‘id’: [1, 2, 3, 4, 5],
‘Name’: [‘Billy’, ‘Brian’, ‘Bran’, ‘Bryce’, ‘Betty’],
‘subject_id’: [‘sub2’, ‘sub4’, ‘sub3’, ‘sub6’, ‘sub5’]})
print(left)
print(“========================================”)
print(right)
print(pd.merge(left, right, on=‘id’)) # 在一个键上合并两个数据帧
print(pd.merge(left, right, on=[‘id’, ‘subject_id’])) # 合并多个键上的两个数据框
‘’’
left LEFT OUTER JOIN 使用左侧对象的键
right RIGHT OUTER JOIN 使用右侧对象的键
outer FULL OUTER JOIN 使用键的联合
inner INNER JOIN 使用键的交集
‘’’
print(pd.merge(left, right, on=‘subject_id’, how=‘left’)) # Left Join
print(pd.merge(left, right, on=‘subject_id’, how=‘right’)) # Right Join
print(pd.merge(left, right, how=‘outer’, on=‘subject_id’)) # Outer Join
pd.merge(left, right, on=‘subject_id’, how=‘inner’) # Inner Join
print(“-----------------------------------------”)
print(pd.concat([left, right]))
print(pd.concat([left, right], keys=[‘x’, ‘y’]))
rs = pd.concat([left, right],keys=[‘x’,‘y’],ignore_index=True)
print(pd.concat([left, right],axis=1))
print(left.append(right))

代码 Github地址:https://github.com/shadowagnoy/python_learn/