共计 3062 个字符,预计需要花费 8 分钟才能阅读完成。
作者 |B. Chen
编译 |VK
起源 |Towards Datas Science
Pandas 是一个惊人的库,它蕴含了大量用于操作数据的内置函数。其中,transform() 在解决行或列时十分有用。
在本文中,咱们将介绍以下最罕用的 Pandas transform() 用处:
- 转换值
- 组合 groupby()
- 过滤数据
- 在组级别解决缺失值
请查看我的 Github repo 以获取源代码;https://github.com/BindiChen/…
1. 转换值
咱们来看看 pd.transform(func, axis=0)
- 第一个参数 func 指定用于操作数据的函数。它能够是函数、字符串函数名、函数列表或轴标签 -> 函数的字典
- 第二个参数轴指定函数利用于哪个轴。0 示意对每列利用 func,1 示意对每行利用 func。
让咱们看看 transform() 是如何在一些示例的帮忙下工作的。
函数
咱们能够把函数传递给 func。例如
df = pd.DataFrame({'A': [1,2,3], 'B': [10,20,30] })
def plus_10(x):
return x+10
df.transform(plus_10)
也能够应用 lambda 表达式。上面是 plus_10() 的 lambda 等价模式:
df.transform(lambda x: x+10)
字符串函数
咱们能够将任何无效的 Pandas 字符串函数传递给 func,例如 ’sqrt’:
df.transform('sqrt')
函数列表
func 能够是函数的列表。例如,来自 NumPy 的 sqrt 和 exp:
df.transform([np.sqrt, np.exp])
轴标签 -> 函数的字典
func 能够是轴标签 -> 函数的字典。例如
df.transform({
'A': np.sqrt,
'B': np.exp,
})
2. 组合 groupby()
Pandas transform() 最引人注目的用法之一是组合 groupy() 后果。
让咱们通过一个例子来看看这是如何工作的。假如咱们有一个对于连锁餐厅的数据集
df = pd.DataFrame({'restaurant_id': [101,102,103,104,105,106,107],
'address': ['A','B','C','D', 'E', 'F', 'G'],
'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'],
'sales': [10,500,48,12,21,22,14]
})
咱们能够看到,每个城市都有多家餐厅在销售。咱们想晓得“每一家餐厅在本市的销售额占比是多少”。预期输入为:
在这个计算中最辣手的局部是,咱们须要失去一个城市的总销售额,并将其合并到数据中,以失去百分比。
有两种解决方案:
- groupby()、apply() 和 merge()
- groupby() 和 transform()
解决方案 1:groupby()、apply() 和 merge()
第一种解决方案是应用 groupby() 宰割数据,并应用 apply() 聚合每个组,而后应用 merge() 将后果合并回原始数据帧中
第 1 步:应用 groupby() 和 apply() 计算城市销售总额
city_sales = df.groupby('city')['sales']
.apply(sum).rename('city_total_sales').reset_index()
groupby(’city’)通过在 city 列上分组来拆分数据。对于每个组,函数 sum 利用于 sales 列,以计算每个组的总和。最初,将新列重命名为 city_total_sales 并重置索引(留神:须要 reset_inde() 来革除 groupby(’city’)生成的索引。
此外,Pandas 还有一个内置的 sum() 函数,上面是 Pandas sum() 的等效函数:
city_sales = df.groupby('city')['sales']
.sum().rename('city_total_sales').reset_index()
第 2 步:应用 merge() 函数合并后果
df_new = pd.merge(df, city_sales, how='left')
应用 merge() 和 left outer join 的 how=’left’ 将组后果合并回到原始的 DataFrame 中
第 3 步:计算百分比
最初,能够计算并格式化百分比。
df_new['pct'] = df_new['sales'] / df_new['city_total_sales']
df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))
这当然是咱们的工作。但这是一个多步骤的过程,须要额定的代码能力以咱们须要的模式获取数据。
咱们能够应用 transform() 函数无效地解决这个问题
解决方案 2:groupby() 和 transform()
这个解决方案扭转了游戏规则。一行代码就能够解决利用和合并问题。
步骤 1:应用 groupby() 和 transform() 计算城市销售总额
转换函数在执行转换后保留与原始数据集雷同数量的项。因而,应用 groupby 后跟 transform(sum)的单行步骤返回雷同的输入。
df['city_total_sales'] = df.groupby('city')['sales']
.transform('sum')
第 2 步:计算百分比
最初,这和求百分比是一样的。
df['pct'] = df['sales'] / df['city_total_sales']
df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))
3. 过滤数据
transform() 也可用于过滤数据。在这里,咱们试图取得该市总销售额超过 40 的记录
df[df.groupby('city')['sales'].transform('sum') > 40]
4. 在组级别解决失落的值
Pandas transform() 的另一个用法是在组级别解决失落的值。让咱们用一个例子来看看这是如何工作的。
这里有一个数据帧供演示
df = pd.DataFrame({'name': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
'value': [1, np.nan, np.nan, 2, 8, 2, np.nan, 3]
})
在下面的示例中,能够按名称将数据分成三组,每个组都短少值。替换缺失值的常见解决方案是用平均值替换 NaN。
让咱们看看每组的平均值。
df.groupby('name')['value'].mean()
name
A 1.0
B 5.0
C 2.5
Name: value, dtype: float64
在这里,咱们能够应用 transform() 将短少的值替换为组平均值。
df['value'] = df.groupby('name')
.transform(lambda x: x.fillna(x.mean()))
你能够在我的 Github 上获取源代码:https://github.com/BindiChen/…
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/