2016-04-27 3 views
1

Ich habe folgende zwei Datenbanken fusionieren verursacht:pandas: column Formatierungsprobleme Probleme

url='https://raw.githubusercontent.com/108michael/ms_thesis/master/rgdp_catcode.merge' 

df=pd.read_csv(url, index_col=0) 
df.head(1) 

    naics catcode          GeoName Description  ComponentName year GDP  state 
0 22 E1600',\t'E1620',\t'A4000',\t'E5000',\t'E3000'... Alabama  Utilities Real GDP by state 2004 5205 AL 

url='https://raw.githubusercontent.com/108michael/ms_thesis/master/mpl.Bspons.merge' 
df1=pd.read_csv(url, index_col=0) 

df1.head(1)  
    state year unemployment log_diff_unemployment id.thomas party type date bills id.fec years_exp session  name disposition  catcode 
0 AK 2006 6.6  -0.044452 1440 Republican sen  2006-05-01 s2686-109 S2AK00010 39 109  National Cable & Telecommunications Association  support  C4500 

Bezüglich df, musste ich zur manuellen Eingabe die catcode Werte. Ich denke, deshalb ist die Formatierung ausgeschaltet. Was ich möchte, ist einfach die Werte ohne das \t Präfix zu haben. Ich möchte die dfs auf catcode, state, year zusammenführen. Ich habe früher einen Test gemacht, wobei ein df1.catcode mit nur einem Wert pro Zelle mit den Werten in einem anderen df.catcode verglichen wurde, der mehr als einen Wert pro Zelle hatte und funktionierte.

Also technisch alles, was ich tun muss, ist die \t vor jedem folgenden Wert in df.catcode zu verlieren, aber zusätzlich, wenn jemand jemals eine Zusammenführung dieser Art vor getan hat, würden alle "Vorbehalte" durch Erfahrung gelernt geschätzt. Mein merge-Code sieht wie folgt aus:

mplmerge=pd.merge(df1,df, on=(['catcode', 'state', 'year']), how='left') 

Ich denke, das mit dem regex Methode durchgeführt werden kann, ich bin jetzt in der Dokumentation suchen.

Antwort

1

Reinigung catcode Säule in df ist ziemlich einfach:

catcode_fixed = df.catcode.str.findall('[A-Z][0-9]{4}') 

Diese eine Reihe mit einer Liste von catcodes in jeder Zeile produzieren:

catcode_fixed.head(3) 
Out[195]: 
0 [E1600, E1620, A4000, E5000, E3000, E1000] 
1   [X3000, X3200, L1400, H6000, X5000] 
2   [X3000, X3200, L1400, H6000, X5000] 
Name: catcode, dtype: object 

Wenn ich das richtig verstanden, was Sie wollen, dann Sie müssen diese Listen "aufheben". Here ist der Trick, kurz:

catcode_fixed = catcode_fixed = catcode_fixed.apply(pd.Series).stack() 
catcode_fixed.index = catcode_fixed.index.droplevel(-1) 

Also, wir haben (beachten Sie die Indexwerte):

catcode_fixed.head(12) 
Out[206]: 
0 E1600 
0 E1620 
0 A4000 
0 E5000 
0 E3000 
0 E1000 
1 X3000 
1 X3200 
1 L1400 
1 H6000 
1 X5000 
2 X3000 
dtype: object 

nun die alte catcode fallen und in die neue Verbindung:

df.drop('catcode',axis = 1, inplace = True) 
catcode_fixed.name = 'catcode' 
df = df.join(catcode_fixed) 

Übrigens müssen Sie möglicherweise df1.reset_index() beim Zusammenführen der Datenrahmen verwenden.

+0

Danke ptrj! –