2016-04-04 10 views
0

Ich habe mehrere DataFrames, die ich zusammenführen möchte, wo ich möchte, dass der Füllwert eine leere Zeichenfolge anstelle von Nan. Einige der DataFrames haben bereits Nan Werte in ihnen. Concat Art macht was ich will aber leere Werte mit Nan füllen. Wie kann man füllen sie nicht mit nan oder die fill_value angeben, so etwas zu erreichen:Merge unaligned DataFrames beim Füllen mit leeren String

>>> df1 
    Value1 
0  1 
1  NaN 
2  3 

>>> df2 
    Value2 
1  5 
2  Nan 
3  7 

>>> merge_multiple_without_nan([df1,df2]) 
    Value1 Value2 
0  1  
1  NaN  5 
2  3  NaN 
3    7 

Dies ist, was concat tut:

>>> concat([df1,df2], axis=1) 
    Value1 Value2 
0  1  NaN 
1  NaN  5 
2  3  NaN 
3  NaN  7 

Antwort

0

Nun, ich konnte keine Funktion in concat finden oder fusionieren, dass dies allein würde behandeln, aber der Code funktioniert unten ohne viel hassel :

df1 = pd.DataFrame({'Value2': [1,np.nan,3]}, index = [0,1, 2]) 
df2 = pd.DataFrame({'Value2': [5,np.nan,7]}, index = [1, 2, 3]) 
# Add temporary Nan values for the data frames. 
df = pd.concat([df1.fillna('X'), df2.fillna('Y')], axis=1) 
df= 
    Value2 Value2 
0  1 NaN 
1  X  5 
2  3  Y 
3 NaN  7 

Schritt 2:

df.fillna('', inplace=True) 
df= 
    Value2 Value2 
0  1 
1  X  5 
2  3  Y 
3    7 

Schritt 3:

df.replace(to_replace=['X','Y'], value=np.nan, inplace=True) 
df= 
    Value2 Value2 
0  1 
1 NaN  5 
2  3 NaN 
3    7 
0

Nach concat verwenden, können Sie den Datenrahmen iterieren Sie Zusammengeführt, suchen Sie die fehlenden Indizes und füllen Sie sie mit einer leeren Zeichenfolge aus. Dies sollte für die Verkettung einer beliebigen Anzahl von DataFrames funktionieren, solange Ihre Spaltennamen eindeutig sind.

# Concatenate all of the DataFrames. 
merge_dfs = [df1, df2] 
full_df = pd.concat(merge_dfs, axis=1) 

# Find missing indices for each merged frame, fill with an empty string. 
for partial_df in merge_dfs: 
    missing_idx = full_df.index.difference(partial_df.index) 
    full_df.loc[missing_idx, partial_df.columns] = '' 

Die resultierende Ausgabe Ihrer Beispieldaten:

Value1 Value2 
0  1  
1 NaN  5 
2  3 NaN 
3    7