numpy 基于长表格式中的FirstYear和LastYear插补值

lfapxunr  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(86)

我有一个关于公司级别的长表,上面有第一年和最后一年的活动以及他们的邮政编码。

pd.DataFrame({'Firm':['A','B','C'],
         'FirstYear':[2020, 2019, 2018],
         'LastYear':[2021, 2022, 2019],
         'Zipcode':['00000','00001','00003']})

Firm    FirstYear   LastYear    Zipcode
A   2020    2021    00000
B   2019    2022    00001
C   2018    2019    00003

我想得到包含每个活跃年份的邮政编码的面板数据,所以理想情况下,我可能需要一个宽表,根据第一年和去年、以及第一年和去年之间的每一年来估算邮政编码的值。
它应该如下所示:

2020    2021    2019    2022    2018
A   00000   00000           
B   00001   00001   00001   00001   
C                   00003          00003

我有一些代码可以为每行创建一个长表,但我有数百万行,这需要很长时间。从性能和内存使用方面来说,转换长表的最佳方法是什么?我必须将每年的邮政编码值输入Pandas。
先谢了。
回应答案的更新:假设有一家公司的第一年和最后一年与其他公司没有重叠。

df=pd.DataFrame({'Firm':['A','B','C'],
         'FirstYear':[2020, 2019, 1997],
         'LastYear':[2021, 2022, 2008],
         'Zipcode':['00000','00001','00003']})

代码的输出如下所示:

Firm    2020    2021    2019    2022    1997    2008
A       00000   00000               
B       00001   00001   00001   00001       
C                                      00003    00003
mnemlml8

mnemlml81#

以下是pd.melt()的解决方案

d = (pd.melt(df,id_vars=['Firm','Zipcode'])
.set_index(['Firm','value'])['Zipcode']
.unstack(level=1))

d = (d.ffill(axis=1)
.where(d.ffill(axis=1).notna() & 
d.bfill(axis=1).notna())
.reindex(df[['FirstYear','LastYear']].stack().unique(),axis=1))

原始答复:

(pd.melt(df,id_vars=['Firm','Zipcode'])
.set_index(['Firm','value'])['Zipcode']
.unstack(level=1)
.reindex(df[['FirstYear','LastYear']].stack().unique(),axis=1))

输出:

value   2020   2021   2019   2022   2018
Firm                                    
A      00000  00000    NaN    NaN    NaN
B      00001  00001  00001  00001    NaN
C        NaN    NaN  00003    NaN  00003

相关问题