2017-05-09 1 views
1

ich einen Datenrahmen haben, in Python, mit diesen HeaderUmbenennen von mehreren Spalten in einem Panda Datenrahmen, wo durch Umbenennung Sie könnten versehentlich Spalten mit demselben Namen erstellen

GP 2016-Dec 2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov 

und ich möchte es zu

ändern
GP  2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov 2017-Dec 

Also habe ich ein Array mit dem Datum, das ich für

new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr', u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep', u'2017-Oct', u'2017-Nov', u'2017-Dec'] 

und einem Array ersetzen wollen das alte Datum

old_date = Index([u'2016-Dec', u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr', 
    u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep', 
    u'2017-Oct', u'2017-Nov'], 
    dtype='object') 

und dann einen Zyklus gemacht, in dem jede Spalte einzeln geändert wird.

j = 0 
for i in new_date: 
    print old_date[j] + ' : ' + i 
    df.rename(columns={old_date[j] : i}, inplace=True) 
    j = j + 1 

und das Endergebnis ist

GP 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 2017-Dec 

Also, der Grund, mein Zyklus nicht funktioniert, ist, weil, wenn ich umbenennen meine ersten Spalte „2016-Dec“ bis „2017-Jan“, die neue Datenrahmen wird so aussehen

GP 2017-Jan 2017-Jan 2017-Feb 2017-Mar 2017-Apr 2017-May 2017-Jun 2017-Jul 2017-Aug 2017-Sep 2017-Oct 2017-Nov 

es zwei Spalten haben, die Namen „2017-Jan“ und dann der nächste Zyklus beginnen und das Programm alle Spalten umbenennen wird, die Bezeichnung „2017-Jan“ sind "2017-Feb" ... und so weiter.

Also das eigentliche Problem ist, dass ich nicht weiß, wie es zu beheben ist oder ob es eine direktere Möglichkeit gibt, alle Spalten auf einmal zu ändern. Hoffe, jemand wird mich erleuchten! Vielen Dank!

+0

sind Ihre Spaltennamen wirklich Strings (Unicode) oder Datumsangaben? –

+0

Sie sind Zeichenfolge keine Datumswerte –

Antwort

0

stattdessen den Spalt jedes Mal in dem for-Schleife der Umbenennung. Sie könnten ein Diktat erstellen, das alte Daten und neue Daten abbildet und dieses Diktat anschließend zum Umbenennen verwendet. Siehe das Beispiel unten

old_date =[u'2016-Dec', u'2017-Jan', u'2017-Feb'] 
df = pd.DataFrame.from_records([(1,2,3)],columns = old_date) 
print df 
''' 
    2016-Dec 2017-Jan 2017-Feb 
0   1   2   3 
''' 

new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar'] 
map_dict = {} 
for o,n in zip(old_date,new_date): 
    map_dict[o] = n 

print map_dict 
''' 
{u'2016-Dec': u'2017-Jan', u'2017-Jan': u'2017-Feb', u'2017-Feb': u'2017-Mar'} 
''' 

df.rename(columns=map_dict, inplace=True) 
print df 

''' 
     2017-Jan 2017-Feb 2017-Mar 
0   1   2   3 
''' 
0

Angenommen, Ihre dataframe wird df genannt, versuchen Sie Folgendes:

from dateutil.relativedelta import relativedelta 

df.columns = [(pd.to_datetime(df.columns[i]) + relativedelta(months=1)).strftime(format="%Y-%b") for i in range(0, len(df.columns))] 

Im Grunde, was der Code tut, ist es auf die verschiedenen Elemente des Spaltenindex Schleifen und mit jedem Element führt Folgendes aus:

  1. konvertiert Ihre String in einen datetime
  2. fügt 1 Monat zu Ihrem datetime
  3. wandelt in ein string in dem gewünschten Format zurück ("%Y-%b")
Verwandte Themen