做者|B. Chen
编译|VK
来源|Towards Datas Sciencepython
Pandas是一个惊人的库,它包含了大量用于操做数据的内置函数。其中,transform()在处理行或列时很是有用。git
在本文中,咱们将介绍如下最经常使用的Pandas transform()用途:github
请查看个人Github repo以获取源代码;https://github.com/BindiChen/...app
咱们来看看pd.transform(func, axis=0)机器学习
让咱们看看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等价形式:spa
df.transform(lambda x: x+10)
咱们能够将任何有效的Pandas字符串函数传递给func,例如'sqrt':.net
df.transform('sqrt')
func能够是函数的列表。例如,来自NumPy的sqrt和exp:3d
df.transform([np.sqrt, np.exp])
func能够是轴标签->函数的字典。例如
df.transform({ 'A': np.sqrt, 'B': np.exp, })
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()将结果合并回原始数据帧中
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()
df_new = pd.merge(df, city_sales, how='left')
使用merge()和left outer join的how='left'将组结果合并回到原始的DataFrame中
最后,能够计算并格式化百分比。
df_new['pct'] = df_new['sales'] / df_new['city_total_sales'] df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))
这固然是咱们的工做。但这是一个多步骤的过程,须要额外的代码才能以咱们须要的形式获取数据。
咱们可使用transform()函数有效地解决这个问题
这个解决方案改变了游戏规则。一行代码就能够解决应用和合并问题。
转换函数在执行转换后保留与原始数据集相同数量的项。所以,使用groupby后跟transform(sum)的单行步骤返回相同的输出。
df['city_total_sales'] = df.groupby('city')['sales'] .transform('sum')
最后,这和求百分比是同样的。
df['pct'] = df['sales'] / df['city_total_sales'] df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))
transform()也可用于过滤数据。在这里,咱们试图得到该市总销售额超过40的记录
df[df.groupby('city')['sales'].transform('sum') > 40]
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/