繁体   English   中英

根据条件填写 dataframe 中的列

[英]Fill up columns in dataframe based on condition

我有一个 dataframe,如下所示:

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     

更具体地说,我有一个 dataframe 由每个日历年 (cyear) 的公司 (id) 的月度 (月) 数据组成。 如果相应的行,即月份,代表公司财政年度的结束,则 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 到当前 fyear 值,例如 id 1)。 此外,给定公司的最后一行可能不一定是其财政年度结束月份,这在 id 1 的情况下很明显。最后,可能存在没有财政年度信息可用的公司。

我很感激这方面的任何帮助。

你想要这个吗?

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)

Output

    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

我有一个 dataframe,如下所示:

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
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    

更具体地说,我有一个 dataframe 由每个日历年 (cyear) 的公司 (id) 的月度 (月) 数据组成。 如果相应的行,即月份,代表公司财政年度的结束,则 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
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  

请注意,可能会缺少月份,这在 id 1 的情况下很明显,并且财政年度可能在不同的月份结束,通过比较 id 1 和 id 4 可以明显看出。此外,给定公司的最后一行可能不一定是其财政年度月底,在 id 1 的情况下很明显。

我很感激这方面的任何帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM