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
- 这个参数意味着什么first
。first
这里与 结合起来做什么transform
?
谢谢
方法中的参数.transform()
可以是NumPy函数、字符串函数名或用户定义的函数。这意味着在该行中
.transform(\'first\')\n
Run Code Online (Sandbox Code Playgroud)\n它是一个字符串函数名称。所以它代表了函数first()
。
first()
?这是 GroupBy 的方法.first()
。
first()
返回什么?它返回一系列中的第一个非NaN
值NaN
,或者如果没有则返回。
.transform()
作用?它将其参数函数应用于数据帧的每一列(即系列)以获得新的(转换后的)列。然后它返回一个由此类(转换后的)列组成的数据帧。
\n在系列的情况下,它返回 \xe2\x80\x94 当然 \xe2\x80\x94 是一个转换后的系列。
\n.transform
必须返回一个具有相同大小的系列?不,这只是一种可能。
\n另一个是标量\xe2\x80\x94 它将被广播(重复)以形成具有相同大小的系列。
使用的函数(GroupBy 的方法first()
)就是此类函数的一个很好的示例。
.transform(\'first\')
返回什么呢?它返回与源组块形状相同的系列/数据帧,其中每个单独列中的所有值都替换为该列中的第一个非NaN
值NaN
,如果没有则替换为。
线条
\n .groupby(df[\'Date\'])\n .transform(\'first\') \n
Run Code Online (Sandbox Code Playgroud)\n首先将您的(中间)系列分成各个日期组,然后在重组之前 \xe2\x80\x94 \xe2\x80\x94 将函数应用于first()
每个组中的每个系列。
NaN
如果存在这样的值,它会有效地用其系列中的第一个非值替换每个组中的每个值。
这意味着在结果系列(您的新列)中,(中间)系列的所有值都将替换为NaN
同一天的第一个非值(如果同一天存在这样的值)。