2017-06-28 2 views
2

Ich habe diese Art von DatenrahmenErstellen neuen Datenrahmen als geordnete Mischung aus Spalten anderen Datenrahmen

import pandas as pd 

df1 = pd.DataFrame({'a':[1.1,1.1,1.1], 'b':[2.1,2.1,2.1], 'c':[3.1,3.1,3.1]}) 
df2 = pd.DataFrame({'aa':[1.2,1.2,1.2], 'bb':[2.2,2.2,2.2], 'cc':[3.2,3.2,3.2]}) 
df3 = pd.DataFrame({'aaa':[1.3,1.3,1.3], 'bbb':[2.3,2.3,2.3], 'ccc':[3.3,3.3,3.3]}) 

Diese Rahmen haben immer die gleiche Form (und Spaltennamen alphabetische Reihenfolge passen doesnt immer). Ich möchte der beste Weg, um herauszufinden, um ihre Spalten in dem resultierenden Rahmen zu kombinieren, die wie folgt aussieht:

 a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 

Mein Ansatz ist verschachtelten Schleifen und Füllen neue Rahmen Spalte für Spalte:

df_new = pd.DataFrame() 

for i in range(df1.shape[1]): 
    for df in [df1, df2, df3]: 
     df_new[df.columns[i]] = df.iloc[:, i] 

print(df_new) 

Es funktioniert, aber ich denke, es gibt einen zuverlässigeren Weg, dies zu tun.

df_new = pd.concat([df1,df2,df3],axis=1) 

small = df1.shape[1] 
big = df_new.shape[1] 

#create correct order 
new_order = [] 

for i in range(small): 
    new_order.extend(list(range(i, big, small))) 

df_new.iloc[:, new_order] 

Dank

:

EDIT: mit Hilfe von pd.concat (Danke @Tbaki) kann es auch Woth zwei Schritten durchgeführt werden!

Antwort

3

IIUC:

In [17]: pd.concat([df1,df2,df3],axis=1) \ 
      .loc[:, np.concatenate([t for t in zip(df1.columns,df2.columns,df3.columns)])] 
Out[17]: 
    a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
+0

Brilliant Zip Idee! –

+0

@AlexeyTrofimov, danke! :) – MaxU

1

können Sie verwenden concat dann reindex_axis:

df = pd.concat([df1,df2,df3],axis=1) 
df.reindex_axis(sorted(df.columns), axis=1) 

Ausgang

 a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
+0

Hallo! pd.concat hilft Frame für Frame zu verketten, ich brauche es spaltenweise (aaaaa bbbbbccccccc) wie in meinem Beispiel –

+0

@AlexeyTrofimov Sie wollen die Reihenfolge in der Spalte abweichen Name ? – Tbaki

+0

Hier ist, was ich brauche: http://imgur.com/a/h48SN –

2

können Sie verwenden concat + sort_index:

df = pd.concat([df1,df2,df3],axis=1).sort_index(axis=1) 
print (df) 
    a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 

Ein bisschen eine andere Antwort verbessert:

012.351.
dfs= [df1,df2,df3] 
cols = np.concatenate(list(zip(df1.columns,df2.columns,df3.columns))) 
df = pd.concat(dfs,axis=1).reindex_axis(cols, axis=1) 
print (df) 
    a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 

Oder:

from itertools import chain 

dfs= [df1,df2,df3] 
cols = chain.from_iterable(list(zip(df1.columns,df2.columns,df3.columns))) 
df = pd.concat(dfs,axis=1).reindex_axis(cols, axis=1) 
print (df) 
    a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
+0

Danke, aber es wird leider nicht mit echten Spaltennamen funktionieren. Kranke Info im ersten Beitrag hinzufügen. –

0

Erstellen Sie einen neuen Datenrahmen durch alle Spalten aus den drei Datenrahmen, um hinzuzufügen. Dies ist die Lösung.

import pandas as pd 
df1 = pd.DataFrame({'a':[1.1,1.1,1.1], 'b':[2.1,2.1,2.1], 'c':[3.1,3.1,3.1]}) 
df2 = pd.DataFrame({'aa':[1.2,1.2,1.2], 'bb':[2.2,2.2,2.2], 'cc':[3.2,3.2,3.2]}) 
df3 = pd.DataFrame({'aaa':[1.3,1.3,1.3], 'bbb':[2.3,2.3,2.3], 'ccc':[3.3,3.3,3.3]}) 

df = pd.DataFrame() 
for i,name in enumerate(df2.columns.values): 
    df[df1.columns[i]]= df1[df1.columns[i]] 
    df[name]= df2[name] 
    df[df3.columns[i]]= df3[df3.columns[i]] 
print(df) 

Ausgang:

 a aa aaa b bb bbb c cc ccc 
0 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
1 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 
2 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 

Dies ist der Teil, wo Sie am meisten interessiert sein werden an!

for i,name in enumerate(df2.columns.values): 
     df[df1.columns[i]]= df1[df1.columns[i]] 
     df[name]= df2[name] 
     df[df3.columns[i]]= df3[df3.columns[i]] 

Also, was ich im Grunde tun

df[df1.columns[i]]= df1[df1.columns[i]]

einen neuen Datenrahmen mit df[column_name] Erstellen von wo column_name df1.columns[i] wäre ->df1.columns[0] ->a

Ähnliches gilt für , df3.columns[i] ->df3.columns[0] ->aaa.

Allerdings bekomme ich Spalte name aus dem zweiten Datenrahmen df2 mit df2.columns.values.Also in diesem Fall

df[name]= df1[name]

ist genug.

Verwandte Themen