前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-for-data-高阶应用transform

python-for-data-高阶应用transform

作者头像
皮大大
发布2021-03-01 14:42:54
3000
发布2021-03-01 14:42:54
举报
文章被收录于专栏:机器学习/数据可视化

本文中详解介绍了pandas中transform()方法的使用

参数详解

代码语言:javascript
复制
DataFrame.transform(self, func, axis=0, *args, **kwargs) → 'DataFrame'[source]
Call func on self producing a DataFrame with transformed values.

Produced DataFrame will have same axis length as self.
  • funcfunction, str, list or dict Function to use for transforming the data. If a function, must either work when passed a DataFrame or when passed to DataFrame.apply.

Accepted combinations are:

代码语言:javascript
复制
- function

- string function name

- list of functions and/or function names, e.g. [np.exp. 'sqrt']

- dict of axis labels -> functions, function names or list of such.
  • axis

{0 or ‘index’, 1 or ‘columns’}, default 0 If 0 or ‘index’: apply function to each column. If 1 or ‘columns’: apply function to each row.

  • *args

Positional arguments to pass to func.

  • **kwargs

Keyword arguments to pass to func.

  • Returns:DataFrame

A DataFrame that must have the same length as self.

  • Raises:ValueError

If the returned DataFrame has a different length than self.

代码语言:javascript
复制
import numpy as np
import pandas as pd

transform方法

特点

transform方法通常是和groupby方法一起连用的

  • 产生一个标量值,并且广播到各分组的尺寸数据中
  • transform可以产生一个和输入尺寸相同的对象
  • transform不可改变它的输入
代码语言:javascript
复制
df = pd.DataFrame({
    "key":["a","b","c"] * 4,
    "values":np.arange(12.0)
})
df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

key

values

0

a

0.0

1

b

1.0

2

c

2.0

3

a

3.0

4

b

4.0

5

c

5.0

6

a

6.0

7

b

7.0

8

c

8.0

9

a

9.0

10

b

10.0

11

c

11.0

分组
代码语言:javascript
复制
g = df.groupby("key").values  # 分组再求平均
g.mean()
代码语言:javascript
复制
key
a    4.5
b    5.5
c    6.5
Name: values, dtype: float64
transform使用

每个位置被均值取代

传递匿名函数
代码语言:javascript
复制
g.transform(lambda x:x.mean())
代码语言:javascript
复制
0     4.5
1     5.5
2     6.5
3     4.5
4     5.5
5     6.5
6     4.5
7     5.5
8     6.5
9     4.5
10    5.5
11    6.5
Name: values, dtype: float64
传递agg方法中的函数字符串别名

内建的聚合函数直接传递别名,max\min\sum\mean

代码语言:javascript
复制
g.transform("mean")
代码语言:javascript
复制
0     4.5
1     5.5
2     6.5
3     4.5
4     5.5
5     6.5
6     4.5
7     5.5
8     6.5
9     4.5
10    5.5
11    6.5
Name: values, dtype: float64
tranform 和 返回S的函数一起使用
代码语言:javascript
复制
g.transform(lambda x:x * 2)
代码语言:javascript
复制
0      0.0
1      2.0
2      4.0
3      6.0
4      8.0
5     10.0
6     12.0
7     14.0
8     16.0
9     18.0
10    20.0
11    22.0
Name: values, dtype: float64
降序排名
代码语言:javascript
复制
g.transform(lambda x:x.rank(ascending=False))
代码语言:javascript
复制
0     4.0
1     4.0
2     4.0
3     3.0
4     3.0
5     3.0
6     2.0
7     2.0
8     2.0
9     1.0
10    1.0
11    1.0
Name: values, dtype: float64
类似apply功能

向tranform中直接传递函数

代码语言:javascript
复制
def normalize(x):
    return (x - x.mean()) / x.std()

g.transform(normalize)
代码语言:javascript
复制
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: values, dtype: float64
代码语言:javascript
复制
g.apply(normalize)  # 结果同上
代码语言:javascript
复制
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: values, dtype: float64
归一化实例
代码语言:javascript
复制
normalized = (df["values"] - g.transform("mean")) / g.transform("std") # 内置的聚合函数直接传递
normalized
代码语言:javascript
复制
0    -1.161895
1    -1.161895
2    -1.161895
3    -0.387298
4    -0.387298
5    -0.387298
6     0.387298
7     0.387298
8     0.387298
9     1.161895
10    1.161895
11    1.161895
Name: values, dtype: float64

官方实例

代码语言:javascript
复制
df = pd.DataFrame({'A': range(3), 'B': range(1, 4)})
df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

A

B

0

0

1

1

1

2

2

2

3

代码语言:javascript
复制
df.transform(lambda x:x+1)  # 每个元素+1

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

A

B

0

1

2

1

2

3

2

3

4

代码语言:javascript
复制
s = pd.Series(range(3))
s
代码语言:javascript
复制
0    0
1    1
2    2
dtype: int64
代码语言:javascript
复制
s.transform([np.sqrt, np.exp])  # 传入函数即可

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

sqrt

exp

0

0.000000

1.000000

1

1.000000

2.718282

2

1.414214

7.389056

Understanding the Transform Function in Pandas

在这个网站上有一个完整的实例,解释了transform方法的使用

原始数据
求解问题

You can see in the data that the file contains 3 different orders (10001, 10005 and 10006) and that each order consists has multiple products (aka skus).

The question we would like to answer is: “What percentage of the order total does each sku represent?”

For example, if we look at order 10001 with a total of $576.12, the break down would be:

  • B1-20000 = $235.83 or 40.9%
  • S1-27722 = $232.32 or 40.3%
  • B1-86481 = $107.97 or 18.7%

求出不同商品在所在订单的价钱占比

传统方法

先求出一列占比的值,再和原始数据进行合并merge

代码语言:javascript
复制
import pandas as pd
df = pd.read_excel("sales_transactions.xlsx")

df.groupby('order')["ext price"].sum()

order
10001     576.12
10005    8185.49
10006    3724.49
Name: ext price, dtype: float64
代码语言:javascript
复制
order_total = df.groupby('order')["ext price"].sum().rename("Order_Total").reset_index()  # 添加Order_Total列属性的值
df_1 = df.merge(order_total)    # 合并原始数据df和order_total数据
df_1["Percent_of_Order"] = df_1["ext price"] / df_1["Order_Total"]  # 添加Percent_of_Order
使用transform

Transform + groupby连用:先分组再求和

图解transform
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-5-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参数详解
  • transform方法
    • 特点
      • 分组
        • transform使用
          • 传递匿名函数
          • 传递agg方法中的函数字符串别名
          • tranform 和 返回S的函数一起使用
        • 降序排名
          • 类似apply功能
            • 归一化实例
            • 官方实例
            • Understanding the Transform Function in Pandas
              • 原始数据
                • 求解问题
                  • 传统方法
                    • 使用transform
                      • 图解transform
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档