2016-11-01 1 views
2

Also habe ich einen Datenrahmen wie dieses:Python-> Daten Frame-> Erweiterung der Datenrahmen

Date; AK; AL ........ 

12/31/1976; 128,661; 954,940 

3/31/1977; 128,341; 963,555 

......... 

die Datenrahmenform ist (156,56)

Dies sind die gleitenden Durchschnitt sind, vierteljährliche Nummer für die 53 US-Territorien, und ich muss jede Zeile des Datenrahmens duplizieren (von vierteljährlich zu monatlich).

So sollte es so aussehen:

12/31/1976 ; 128,661 ; 954,940 ...... 

1/31/1976 ;  128,661 ; 954,940 

2/31/1976 ; 128,661 ; 954,940 

3/31/1977 ; 128,341 ; 963,555 

4/31/1977 ; 128,341 ; 963,555 

5/31/1977 ; 128,341 ; 963,555 

............... 

So die Endung Datenrahmen wäre (156 * 3, 56) = (468,56).

Hier ist mein schändlich dilettantisch Weg, das Problem zu lösen:

result=[] 

for d in range(dfc.shape[0]): 
    a=dfc.loc[[d]] 
    result.append(a) 
    for i in range(2): 
     result.append(a) 

result2 = pd.concat(result) 

result2.to_csv(outputfile) 

Und jetzt habe ich eine Liste von 474 Datenrahmen in Folge und erfolgreich sie in result2 verbinden. Aber gibt es einen eher pythischen Weg, dies zu tun?

Vielen Dank für Ihre Zeit.

Beispieldaten aus dem Eingang csv

Date AK AL AR AZ CA CO CT DC DE FL GA HI IA ID IL IN KS KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV NY OH OK OR PA PR RI SC SD TN TX US UT VA VI VT WA WI WV WY US

12/31/1976 128661 954940 553053 621466 7130131 808768 1194789 350566 213905 2615803 1462638 326404 848553 234033 3803577 1683495 651434 879378 1101983 1942755 1133973 299863 2999407 1425506 1472189 563727 219449 1736735 158068 454897 272603 2247374 284290 233236 5677756 3768974 757678 803867 3796384 456596 326356 836472 166527 1279266 3905285 68009341 362019 1449598 - 136259 1052788 1626165 481509 118196 136018680

3/31/1977 128341 963555 559382 632022 7210477 818252 1203495 349061 212093 2637798 1478518 329504 859381 237540 3829280 1700039 657837 886421 1110438 1950984 1140207 302194 3033862 1444873 1482550 569446 221903 1751718 159539 460068 276727 2254050 288767 239391 5685289 3785281 765835 816312 3807158 457408 329745 842357 168075 1289540 3953044 68563641 367915 1462887 - 137377 1069036 1640823 485301 120550 137127279

6/30/1977 126396 977083 567917 643876 7305609 829959 1215449 349629 212099 2672554 1495769 332130 869226 241135 3858154 1721593 665523 898318 1122502 1964295 1154737 304645 3069330 1463964 1497019 576081 223573 1772303 161208 464668 278415 2271529 293668 245175 5707264 3815464 774473 829472 3826951 455636 332956 850164 169482 1305168 4003226 69279773 373785 1479718 7696 138750 1087648 1660930 492362 123099 138559545

Antwort

2

Ich glaube, Sie resample mit Resampler.ffill verwenden können. Aber es gibt Probleme mit den letzten Werten - müssen händisch mit Datumzeit letzten Zeile hinzufügen verschoben 2 Monate und mit allen gleichen Werte wie letzte Zeile der ursprünglichen DataFrame

#convert column to datetime 
df.Date = pd.to_datetime(df.Date) 

#duplicated last row to another row with same values 
df.loc[df.index[-1] + 1] = df.iloc[-1] 
#shifted 2 months in column 'Date' 
df.loc[df.index[-1], 'Date'] = df.loc[df.index[-1], 'Date'] + pd.offsets.DateOffset(months=2) 
print (df) 
     Date  AK  AL 
0 1976-12-31 128,661 954,940 
1 1977-03-31 128,341 963,555 
2 1977-05-31 128,341 963,555 

df = df.set_index('Date').resample('M').ffill() 
print (df) 
       AK  AL 
Date       
1976-12-31 128,661 954,940 
1977-01-31 128,661 954,940 
1977-02-28 128,661 954,940 
1977-03-31 128,341 963,555 
1977-04-30 128,341 963,555 
1977-05-31 128,341 963,555 

Wenn Verwendung alte Version des Pandas Parameter müssen fill_method='ffill' instaed .ffill()-see changed API in 0.18.0 :

df = pd.read_csv('quarter to month.csv', thousands=',') 
print (df) 
      Date  AK  AL  AR  AZ  CA  CO \ 
0 12/31/1976 128661 954940 553053 621466 7130131 808768 
1  3/31/1977 128341 963555 559382 632022 7210477 818252 
2  6/30/1977 126396 977083 567917 643876 7305609 829959 
3  9/30/1977 121677 992007 576480 657475 7403502 844079 
... 
... 

df.Date = pd.to_datetime(df.Date) 

df.loc[df.index[-1] + 1] = df.iloc[-1] 
#shifted 2 months in column 'Date' 
df.loc[df.index[-1],'Date']=df.loc[df.index[-1],'Date'] + pd.offsets.DateOffset(months=2) 

df = df.set_index('Date').resample('M', fill_method='ffill') 
print (df) 
       AK  AL  AR  AZ  CA  CO  CT \ 
Date                   
1976-12-31 128661 954940 553053 621466 7130131 808768 1194789 
1977-01-31 128661 954940 553053 621466 7130131 808768 1194789 
1977-02-28 128661 954940 553053 621466 7130131 808768 1194789 
1977-03-31 128341 963555 559382 632022 7210477 818252 1203495 
1977-04-30 128341 963555 559382 632022 7210477 818252 1203495 
1977-05-31 128341 963555 559382 632022 7210477 818252 1203495 
1977-06-30 126396 977083 567917 643876 7305609 829959 1215449 
1977-07-31 126396 977083 567917 643876 7305609 829959 1215449 
1977-08-31 126396 977083 567917 643876 7305609 829959 1215449 
1977-09-30 121677 992007 576480 657475 7403502 844079 1227102 
1977-10-31 121677 992007 576480 657475 7403502 844079 1227102 
1977-11-30 121677 992007 576480 657475 7403502 844079 1227102 
1977-12-31 120632 1005809 585722 672041 7543093 863180 1242052 
... 
... 

Erläuterung:

Resample letzten 2 Zeilen weglassen, so müssen Sie manuell hinzufügen, um es zu DataFrame für gewünschte Ausgabe. Zuerst finden Sie den letzten Indexwert von df.index[-1] (Index ist monoton (0,1,2,3 ..) und es gibt nur ganze Zahlen). Dann füge 1 hinzu und erhalte den Index einer anderen Zeile - z. Wenn der letzte Index 50 ist, ist ein anderer Zeilenindex 51. Dann erweitern Dataframe von loc und fügen Sie die gleichen Werte wie letzte Zeile - ich verwende iloc für die Auswahl der letzten Zeile. Dann müssen die Werte der Date Spalte in der letzten Zeile geändert werden. Wählen Sie es also durch df.loc[df.index[-1], 'Date'] und fügen Sie zwei Monate durch offset (IN [87]) hinzu. Dann können Sie resample verwenden und viele neue Zeilen erhalten, in den letzten Zeilen erhalten Sie eine neue Zeile zwischen der alten ursprünglichen letzten Zeile und der neuen ursprünglichen Anwendung dateoffset.

+0

Versuchen Sie vor meinem Code-Reset-Index von 'df = df.reset_index()' – jezrael

+0

Wenn ich Ihren Code ausführen, bekam ich "DataError: Keine numerischen Typen zu aggregieren" –

+0

Was ist Ihre Pandas-Version? 'print (pd.show_versionen())'. Was ist 'df.info()'? – jezrael

Verwandte Themen