根据条件填充数据框中的列

时间:2021-05-03 13:24:30

标签: python pandas

我有一个如下所示的数据框:

id  cyear  month     datadate  fyear
1    1988      3          nan    nan
1    1988      4          nan    nan
1    1988      5   1988-05-31   1988
1    1988      6          nan    nan
1    1988      7          nan    nan
1    1988      8          nan    nan
1    1988      9          nan    nan
1    1988     12          nan    nan
1    1989      1          nan    nan
1    1989      2          nan    nan
1    1989      3          nan    nan
1    1989      4          nan    nan 
1    1989      5   1989-05-31   1989
1    1989      6          nan    nan
1    1989      7          nan    nan
1    1989      8          nan    nan
1    1990      8          nan    nan
4    2000      1          nan    nan 
4    2000      2          nan    nan
4    2000      3          nan    nan 
4    2000      4          nan    nan 
4    2000      5          nan    nan
4    2000      6          nan    nan 
4    2000      7          nan    nan 
4    2000      8          nan    nan
4    2000      9          nan    nan
4    2000     10          nan    nan
4    2000     11          nan    nan
4    2000     12   2000-12-31   2000
5    2000     11          nan    nan     

更具体地说,我有一个数据框,其中包含每个日历年 (cyear) 的公司 (id) 的月 (month) 数据。如果相应的行(即月份)代表公司财政年度的结束,则 datadate 列将相应的月份结束表示为日期变量,而 fyear 列将表示刚刚结束的相应财政年度。

我现在希望 fyear 值不仅在相应公司财政年度的最后一个月,而且在相应财政年度内的每个月都表示相应的财政年度:

id  cyear  month     datadate  fyear
1    1988      3          nan   1988
1    1988      4          nan   1988
1    1988      5   1988-05-31   1988
1    1988      6          nan   1989
1    1988      7          nan   1989
1    1988      8          nan   1989
1    1988      9          nan   1989
1    1988     12          nan   1989
1    1989      1          nan   1989
1    1989      2          nan   1989
1    1989      3          nan   1989
1    1989      4          nan   1989 
1    1989      5   1989-05-31   1989
1    1989      6          nan   1990
1    1989      7          nan   1990
1    1989      8          nan   1990
1    1990      8          nan   1991
4    2000      1          nan   2000 
4    2000      2          nan   2000
4    2000      3          nan   2000
4    2000      4          nan   2000 
4    2000      5          nan   2000
4    2000      6          nan   2000 
4    2000      7          nan   2000 
4    2000      8          nan   2000
4    2000      9          nan   2000
4    2000     10          nan   2000
4    2000     11          nan   2000
4    2000     12   2000-12-31   2000
5    2000     11          nan    nan   

请注意,月份可能会丢失,这在 id 1 的情况下很明显,并且财政年度可能会在 fyear=cyear 或 fyear=cyear+1 中的不同月份结束(我只包含了前一个示例,可以构建后者例如通过将 1 添加到例如 id 1 的当前财政年度值)。此外,给定公司的最后一行可能不一定是其财政年度结束月份,如 id 1 所示。最后,可能存在没有可用财政年度信息的公司。

感谢您对此的任何帮助。

1 个答案:

答案 0 :(得分:2)

你想要这个吗?

def backword_fill(x):
    x = x.bfill()
    x = x.ffill() + x.isna().astype(int)
    return x
    
df.fyear = df.groupby('id')['fyear'].transform(backword_fill)

输出

    id  cyear  month    datadate  fyear
0    1   1988      3        <NA>   1988
1    1   1988      4        <NA>   1988
2    1   1988      5  1988-05-31   1988
3    1   1988      6        <NA>   1989
4    1   1988      7        <NA>   1989
5    1   1988      8        <NA>   1989
6    1   1988      9        <NA>   1989
7    1   1988     12        <NA>   1989
8    1   1989      1        <NA>   1989
9    1   1989      2        <NA>   1989
10   1   1989      3        <NA>   1989
11   1   1989      4        <NA>   1989
12   1   1989      5  1989-05-31   1989
13   1   1989      6        <NA>   1990
14   4   2000      1        <NA>   2000
15   4   2000      2        <NA>   2000
16   4   2000      3        <NA>   2000
17   4   2000      4        <NA>   2000
18   4   2000      5        <NA>   2000
19   4   2000      6        <NA>   2000
20   4   2000      7        <NA>   2000
21   4   2000      8        <NA>   2000
22   4   2000      9        <NA>   2000
23   4   2000     10        <NA>   2000
24   4   2000     11        <NA>   2000
25   4   2000     12  2000-12-31   2000