KeyError lors de l'utilisation de fonte pour restructurer Dataframe

J'ai un dataframe qui ressemble actuellement à ce qui suit et a 2628 lignes et 101 colonnes. Je veux convertir la ligne years qui est associée aux nombres 0.08333 0.16666 0.249999 et ainsi de suite, dans une colonne:

years      Currency  0.08333333  0.16666666  0.24999999  0.33333332  \
2005-01-04      GBP    4.709456    4.633861    4.586271    4.567017   
2005-01-05      GBP    4.713099    4.649220    4.606802    4.588313   
2005-01-06      GBP    4.707237    4.646861    4.609294    4.593076

Le code est le suivant, où combined_data </​​code> est l'image. J'ai utilisé melt pour cela, mais je reçois l'erreur KeyError: 'years' et je ne sais pas comment gérer ceci:

from pandas.io.excel import read_excel
import pandas as pd
import numpy as np

url = 'http://www.bankofengland.co.uk/statistics/Documents/yieldcurve/uknom05_mdaily.xls'

# check the sheet number, spot: 9/9, short end 7/9
spot_curve = read_excel(url, sheetname=8)
short_end_spot_curve = read_excel(url, sheetname=6)

# do some cleaning, keep NaN for now, as forward fill NaN is not recommended for yield curve
spot_curve.columns = spot_curve.loc['years:']
spot_curve.columns.name = 'years'
valid_index = spot_curve.index[4:]
spot_curve = spot_curve.loc[valid_index]
# remove all maturities within 5 years as those are duplicated in short-end file
col_mask = spot_curve.columns.values > 5
spot_curve = spot_curve.iloc[:, col_mask]


short_end_spot_curve.columns = short_end_spot_curve.loc['years:']
short_end_spot_curve.columns.name = 'years'
valid_index = short_end_spot_curve.index[4:]
short_end_spot_curve = short_end_spot_curve.loc[valid_index]

# merge these two, time index are identical
# ==============================================
combined_data = pd.concat([short_end_spot_curve, spot_curve], axis=1, join='outer')
# sort the maturity from short end to long end
combined_data.sort_index(axis=1, inplace=True)

def filter_func(group):
    return group.isnull().sum(axis=1) <= 50

combined_data = combined_data.groupby(level=0).filter(filter_func)

idx = 0
values = ['GBP'] * len(combined_data.index)
combined_data.insert(idx, 'Currency', values)
print combined_data

pd.melt(combined_data,id_vars=['years']) #ERROR!

Edit: Desired Results:

years                     Currency  
0.08333333   2005-01-04      GBP    4.709456    4.633861    4.586271    4.567017   
0.16666666   2005-01-05      GBP    4.713099    4.649220    4.606802    4.588313   
0.24999999   2005-01-06      GBP    4.707237    4.646861    4.609294    4.593076
0
@JohnE J'ai édité la question. Oui, il s'agit d'une "ligne d'années" et non d'une colonne et j'ai ajouté les résultats souhaités.
ajouté l'auteur Jojo, source
Cool, c'est beaucoup plus clair maintenant.
ajouté l'auteur JohnE, source

1 Réponses

Cela peut avoir besoin d'être ajusté en fonction du nombre de lignes que vous avez par rapport aux colonnes, mais vous donnera les résultats souhaités (plus ou moins):

        years Currency  0.08333333  0.16666666  0.24999999  0.33333332
0  2005-01-04      GBP    4.709456    4.633861    4.586271    4.567017
1  2005-01-05      GBP    4.713099    4.649220    4.606802    4.588313
2  2005-01-06      GBP    4.707237    4.646861    4.609294    4.593076

df['x'] = df.columns.values[-4:-1]
df = df.set_index('x',drop=True)
df.columns = ['years','Currency','v1','v2','v3','v4']

                 years Currency        v1        v2        v3        v4
x                                                                      
0.08333333  2005-01-04      GBP  4.709456  4.633861  4.586271  4.567017
0.16666666  2005-01-05      GBP  4.713099  4.649220  4.606802  4.588313
0.24999999  2005-01-06      GBP  4.707237  4.646861  4.609294  4.593076
0
ajouté
Merci pour la réponse. J'ai réalisé que j'avais fait une erreur dans la façon dont je voulais ma structure de sortie, mais j'ai accepté votre réponse car elle ferait le travail pour la question que j'ai posée ici.
ajouté l'auteur Jojo, source
C'est très bien. J'ai réécrit la question ici si cela vous intéresse.
ajouté l'auteur Jojo, source
@FixIncome Si vous voulez décocher la réponse et refaire la question, ça ne me dérange pas du tout. Bien qu'en général, vous obtiendrez une meilleure réponse en écrivant une nouvelle question, étant donné que les modifications apportées aux anciennes questions sont souvent ignorées (tout dépend du fonctionnement de SO).
ajouté l'auteur JohnE, source