2015-03-29 19 views
5

Desidero poter aggiungere df1 df2, df3 in un df_All, ma poiché ciascun dataframe ha una colonna diversa. Come potrei farlo in ciclo for (ho altre cose che devo fare nel ciclo for)?Come aggiungere colonne selezionate a dataframe panda da df con colonne diverse

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])]) 
df2 = pd.DataFrame.from_items([('B', [5, 6, 7]), ('A', [8, 9, 10])]) 
df3 = pd.DataFrame.from_items([('C', [5, 6, 7]), ('D', [8, 9, 10]), ('A',[1,2,3]), ('B',[4,5,7])]) 
list = ['df1','df2','df3'] 
df_All = pd.DataFrame() 
for i in list: 
    # doing something else as well --- 
    df_All = df_All.append(i) 

enter image description here

voglio che il mio df_All di avere solo (A & B) solo, c'è un modo per questo in loop di cui sopra? qualcosa come aggiungere solo queste due colonne?

risposta

5

se ho capito quello che vuoi, allora è necessario selezionare solo le colonne 'A' e 'B' dal df3 e quindi utilizzare pd.concat:

In [35]: 

df1 = pd.DataFrame.from_items([('A', [1, 2, 3]), ('B', [4, 5, 6])]) 
df2 = pd.DataFrame.from_items([('B', [5, 6, 7]), ('A', [8, 9, 10])]) 
df3 = pd.DataFrame.from_items([('C', [5, 6, 7]), ('D', [8, 9, 10]), ('A',[1,2,3]), ('B',[4,5,7])]) 
df_list = [df1,df2,df3[['A','B']]] 
pd.concat(df_list, ignore_index=True) 
Out[35]: 
    A B 
0 1 4 
1 2 5 
2 3 6 
3 8 5 
4 9 6 
5 10 7 
6 1 4 
7 2 5 
8 3 7 

Si noti che nel codice originale questa è una pratica povero:

list = ['df1','df2','df3'] 

Questa ombre il costruito nel tipo list più anche se era in realtà un nome var valida come df_list hai creato una lista di stringhe e non un elenco di DFS.

Se si desidera determinare le colonne comuni allora si può determinare questo utilizzando il metodo np.intersection sulle colonne:

In [39]: 

common_cols = df1.columns.intersection(df2.columns).intersection(df3.columns) 
common_cols 
Out[39]: 
Index(['A', 'B'], dtype='object') 
+0

che sto cercando di fare questo è nel ciclo for in quanto il codice vero e proprio hanno varia df .. a volte (df1, DF2) a volte (df1, DF2, DF3) ed anche altro calcolo che devo fare in ciclo continuo. Sai se esiste un modo per farlo? – JPC

+0

Dovrai affinare la tua domanda in modo significativo in quanto non è chiaro per me, non c'è motivo per cui non riesci a capire nemmeno dopo aver eseguito alcune operazioni sul dfs concatenandole tutte alla fine – EdChum

+0

oh, scusa ero non chiaro .. quindi in pratica il motivo per cui devo averlo nel ciclo (lista) perché a volte se eseguo il codice ci saranno 100 dataframes che devono essere combinati. a volte ci saranno 500 dataframe tutti insieme. quindi il numero di dataframes è diverso ogni volta che eseguo il codice. quindi non posso visualizzare quanti dati di cui ho bisogno ogni volta, deve provenire dalla "lista" - fammi sapere se ha senso ... – JPC

5

è possibile utilizzare anche impostare la comprensione di unire tutte le colonne comuni da un elenco arbitrario di DataFrames:

df_list = [df1, df2, df3] 
common_cols = list(set.intersection(*(set(c) for c in df_list))) 
df_new = pd.concat([df[common_cols] for df in df_list], ignore_index=True) 
>>> df_new 
    A B 
0 1 4 
1 2 5 
2 3 6 
3 8 5 
4 9 6 
5 10 7 
6 1 4 
7 2 5 
8 3 7 
Problemi correlati