作者|B. Chen
编译|VK
起源|Towards Datas Science

Pandas是一个惊人的库,它蕴含了大量用于操作数据的内置函数。其中,transform()在解决行或列时十分有用。

在本文中,咱们将介绍以下最罕用的Pandas transform()用处:

  1. 转换值
  2. 组合groupby()
  3. 过滤数据
  4. 在组级别解决缺失值

请查看我的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+10df.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]})

咱们能够看到,每个城市都有多家餐厅在销售。咱们想晓得“每一家餐厅在本市的销售额占比是多少”。预期输入为:

在这个计算中最辣手的局部是,咱们须要失去一个城市的总销售额,并将其合并到数据中,以失去百分比。

有两种解决方案:

  1. groupby()、apply()和merge()
  2. 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()nameA    1.0B    5.0C    2.5Name: 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/