Pandas是一个很有用的库,它包含了大量用于操作数据的内置函数。
个中,transform()在处理行或列时非常有用。

Pandas transform函数_函数_数据 计算机

在本文中,我们将先容以下最常用的Pandas transform()用场:

转换值组合groupby()过滤数据在组级别处理缺失落值

请查看我的Github repo以获取源代码;https://github.com/BindiChen/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb

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]})

我们可以看到,每个城市都有多家餐厅在发卖。
我们想知道“每一家餐厅在本市的发卖额占比是多少”。
预期输出为:

在这个打算中最棘手的部分是,我们须要得到一个城市的总发卖额,并将其合并到数据中,以得到百分比。

有两种办理方案:

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()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/machine-learning/blob/master/data-analysis/013-pandas-transform/pandas-transform.ipynb