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