![](/img/trans.png)
[英]Imputing values into a dataframe based on another dataframe and a condition
[英]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.