2015-03-29 27 views
5

Tôi muốn có thể chắp thêm df1 df2, df3 vào một df_All, nhưng vì mỗi khung dữ liệu có cột khác nhau. Làm thế nào tôi có thể làm điều này trong vòng lặp (tôi có những thứ khác mà tôi phải làm trong vòng lặp for)?Cách thêm cột đã chọn vào khung dữ liệu gấu trúc từ df với các cột khác nhau

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

Tôi muốn df_All tôi chỉ có (A & B) duy nhất, là có một cách để này trong vòng lặp ở trên? một cái gì đó giống như chỉ chắp thêm hai cột này?

Trả lời

5

Nếu tôi hiểu những gì bạn muốn thì bạn cần phải chọn chỉ cột 'A' và 'B' từ df3 và sau đó sử dụng 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 

Lưu ý rằng trong mã ban đầu của bạn này là thực hành kém:

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

này bóng tối được xây dựng trong loại list cộng ngay cả khi nó đã thực sự là một tên var hợp lệ như df_list bạn đã tạo ra một danh sách các chuỗi và không phải là một danh sách các dfs.

Nếu bạn muốn xác định các cột chung thì bạn có thể xác định điều này bằng cách sử dụng phương pháp np.intersection trên các cột:

In [39]: 

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

Tôi đang cố gắng thực hiện điều này vì vòng lặp thực tế có thay đổi df .. đôi khi (df1, df2) đôi khi (df1, df2, df3) và tính toán khác mà tôi phải thực hiện trong vòng lặp. Bạn có biết nếu có cách nào để làm điều này? – JPC

+0

Bạn sẽ phải ăn thịt câu hỏi của bạn ra đáng kể vì nó không rõ ràng với tôi, không có lý do gì tôi thấy lý do tại sao bạn không thể thậm chí sau khi thực hiện một số hoạt động trên dfs nối tất cả chúng vào cuối – EdChum

+0

oh, xin lỗi tôi đã không rõ ràng .. vì vậy về cơ bản lý do mà tôi phải có nó trong vòng lặp (danh sách) bởi vì đôi khi nếu tôi chạy mã sẽ có 100 dataframes cần phải được kết hợp. đôi khi sẽ là 500 dataframes tất cả cùng nhau. do đó số lượng các khung dữ liệu khác nhau mỗi khi tôi chạy mã. vì vậy tôi không thể pan ra bao nhiêu dataframe tôi cần mỗi lần, nó phải đến từ "danh sách" - cho tôi biết nếu điều này có ý nghĩa ... – JPC

5

Bạn cũng có thể sử dụng thiết lập sự hiểu biết để tham gia tất cả các cột phổ biến từ một danh sách tùy ý 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 
Các vấn đề liên quan