.transform('first') 是做什么的?

ale*_*sov 3 python dataframe pandas

有人帮我要了一个代码。我理解代码中的所有内容,除了最后一行.transform('first')我看到它的作用(我可以看到它),但我想准确地知道它在后面做了什么才能获得这个结果。

这是我理解的代码部分:

df['Date'] = pd.to_datetime(df['Date'])
df['YEP'] = ( df[::-1].loc[df['Type'].eq('Budget')]
                     .groupby(df['Date'].dt.year)
                     .Value
                     .cumsum()
                     .sub(df['Value'])
                     .add(df['YTD'])
)
Run Code Online (Sandbox Code Playgroud)

这是第一部分的输出:

    Value    Type       Date    YTD     YEP
0     100  Budget 2019-01-01  101.0   974.0
1      50  Budget 2019-02-01  199.0  1022.0
2      20  Budget 2019-03-01  275.0  1078.0
3     123  Budget 2019-04-01  332.0  1012.0
4      56  Budget 2019-05-01    NaN     NaN
5      76  Budget 2019-06-01    NaN     NaN
6      98  Budget 2019-07-01    NaN     NaN
7     126  Budget 2019-08-01    NaN     NaN
8      90  Budget 2019-09-01    NaN     NaN
9      80  Budget 2019-10-01    NaN     NaN
10     67  Budget 2019-11-01    NaN     NaN
11     87  Budget 2019-12-01    NaN     NaN
12    101  Actual 2019-01-01  101.0     NaN
13     98  Actual 2019-02-01  199.0     NaN
14     76  Actual 2019-03-01  275.0     NaN
15     57  Actual 2019-04-01  332.0     NaN
Run Code Online (Sandbox Code Playgroud)

这是整个代码:

df['Date'] = pd.to_datetime(df['Date'])
df['YEP'] = ( df[::-1].loc[df['Type'].eq('Budget')]
                     .groupby(df['Date'].dt.year)
                     .Value
                     .cumsum()
                     .sub(df['Value'])
                     .add(df['YTD'])
                     .groupby(df['Date'])
                     .transform('first') )
Run Code Online (Sandbox Code Playgroud)

运行整个代码后我得到了这个:

    Value    Type       Date    YTD     YEP
0     100  Budget 2019-01-01  101.0   974.0
1      50  Budget 2019-02-01  199.0  1022.0
2      20  Budget 2019-03-01  275.0  1078.0
3     123  Budget 2019-04-01  332.0  1012.0
4      56  Budget 2019-05-01    NaN     NaN
5      76  Budget 2019-06-01    NaN     NaN
6      98  Budget 2019-07-01    NaN     NaN
7     126  Budget 2019-08-01    NaN     NaN
8      90  Budget 2019-09-01    NaN     NaN
9      80  Budget 2019-10-01    NaN     NaN
10     67  Budget 2019-11-01    NaN     NaN
11     87  Budget 2019-12-01    NaN     NaN
12    101  Actual 2019-01-01  101.0   974.0
13     98  Actual 2019-02-01  199.0  1022.0
14     76  Actual 2019-03-01  275.0  1078.0
15     57  Actual 2019-04-01  332.0  1012.0
Run Code Online (Sandbox Code Playgroud)

我知道“转换”就像“应用”。但我不明白应用 - 或transform- 这个参数意味着什么firstfirst这里与 结合起来做什么transform

谢谢

Mar*_*anD 9

    \n
  1. “第一”是什么意思?

    \n
  2. \n
\n

方法中的参数.transform()可以是NumPy函数、字符串函数名或用户定义的函数。这意味着在该行中

\n
    .transform(\'first\')\n
Run Code Online (Sandbox Code Playgroud)\n

它是一个字符串函数名称。所以它代表了函数first()

\n
\n
    \n
  1. 函数从哪里来first()

    \n
  2. \n
\n

这是 GroupBy 的方法.first()

\n
\n
    \n
  1. 函数first()返回什么?

    \n
  2. \n
\n

它返回一系列中的第一个非NaNNaN,或者如果没有则返回。

\n
\n
    \n
  1. 该方法有什么.transform()作用?

    \n
  2. \n
\n

它将其参数函数应用于数据帧的每一列(即系列)以获得新的(转换后的)列。然后它返回一个由此类(转换后的)列组成的数据帧。

\n

在系列的情况下,它返回 \xe2\x80\x94 当然 \xe2\x80\x94 是一个转换后的系列

\n
\n
    \n
  1. 这意味着方法的函数参数.transform必须返回一个具有相同大小的系列?

    \n
  2. \n
\n

不,这只是一种可能。
\n另一个是标量\xe2\x80\x94 它将被广播(重复)以形成具有相同大小的系列。

\n

使用的函数(GroupBy 的方法first())就是此类函数的一个很好的示例。

\n
\n
    \n
  1. 那么该方法.transform(\'first\')返回什么呢?

    \n
  2. \n
\n

它返回与源组块形状相同的系列/数据帧,其中每个单独列中的所有值都替换为该列中的第一个非NaNNaN,如果没有则替换为。

\n
\n

结论:

\n

线条

\n
                 .groupby(df[\'Date\'])\n                 .transform(\'first\') \n
Run Code Online (Sandbox Code Playgroud)\n

首先将您的(中间)系列分成各个日期组,然后在重组之前 \xe2\x80\x94 \xe2\x80\x94 将函数应用于first()每个组中的每个系列。

\n

NaN如果存在这样的值,它会有效地用其系列中的第一个非值替换每个组中的每个值。

\n

这意味着在结果系列(您的新列)中,(中间)系列的所有值都将替换为NaN同一天的第一个非值(如果同一天存在这样的值)。

\n