2015-03-29 16 views
5

Chcę móc dołączyć df1 df2, df3 do jednego df_All, ale ponieważ każda z ramek danych ma inną kolumnę. Jak mogę to zrobić w pętli for (mam inne rzeczy, które muszę zrobić w pętli for)?Jak dołączyć wybrane kolumny do pandasowej ramki danych z df z różnymi kolumnami

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

chcę mój df_All mieć tylko (A & b) jedynie, czy jest jakiś sposób, aby to w pętli powyżej? coś jak dodać tylko te dwie kolumny?

Odpowiedz

5

Jeśli dobrze rozumiem, co chcesz, to musisz wybrać tylko kolumnach „A” i „B” z df3 a następnie użyć 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 

pamiętać, że w oryginalnym kodzie jest biedny praktyka:

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

Ten cienie wbudowanego typu list Plus, nawet jeśli to było rzeczywiście poprawna nazwa var jak df_list utworzeniu listy ciągów, a nie listę DFS.

Jeśli chcesz określić wspólne kolumny następnie można określić to stosując metodę np.intersection na kolumnach:

In [39]: 

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

staram się robić to w pętli, ponieważ rzeczywista Kod mieć różny df .. czasami (DF1, DF2) czasami (DF1, DF2, DF3), a także innych obliczeń, które muszę zrobić w pętla. Czy wiesz, czy istnieje sposób, aby to zrobić? – JPC

+0

Będziesz musiał wypełnić swoje pytanie znacznie, ponieważ jest dla mnie niejasne, nie ma powodu, dla którego widzę, dlaczego nie możesz nawet po wykonaniu niektórych operacji na dfs połączyć je wszystkie pod koniec – EdChum

+0

oh, przepraszam, że byłem nie jest jasne ... więc w zasadzie powód, dla którego muszę go mieć w pętli (lista), ponieważ czasami, gdy uruchomię kod, będzie 100 ramek danych, które należy połączyć. czasami będzie razem 500 ramek danych. więc liczba ramek danych jest inna przy każdym uruchomieniu kodu. więc nie mogę wyłapać, ile razy potrzebuję ramek danych, to musi pochodzić z "listy" - daj mi znać, jeśli to ma sens ... – JPC

5

Można również użyć ustawiony zrozumienie dołączyć wszystkie typowe kolumny z dowolnej listy 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 
Powiązane problemy