繁体   English   中英

基于长表格式的 FirstYear 和 LastYear 估算值

[英]Imputing Values Based on FirstYear and LastYear in Long Table Format

我有一张关于公司级别的长表,其中包含第一个和最后一个活跃年份及其 zip 代码。

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

我想获取包含每个活跃年份的邮政编码的面板数据。 所以理想情况下,我可能想要一个宽表,根据第一年和去年以及第一年和最后一年之间的每一年来估算 Zipcode 的值。

它应该是这样的:

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

我有一些代码可以为每行创建一个长表,但我有数百万行并且需要很长时间。 就性能而言,memory 用于转换长表的最佳方法是什么,我必须在 pandas 中估算每年的邮政编码值?

提前致谢。

回应答案的更新:假设有一家公司的第一年和最后一年没有与其他公司重叠。

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

代码中的 output 是这样的:

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

这是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))

Output:

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

暂无
暂无

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

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