Nối danh sách các khung dữ liệu gấu trúc với nhau


129

Tôi có một danh sách các khung dữ liệu Gấu trúc mà tôi muốn kết hợp thành một khung dữ liệu Gấu trúc. Tôi đang sử dụng Python 2.7.10 và Pandas 0.16.2

Tôi đã tạo danh sách các khung dữ liệu từ:

import pandas as pd
dfs = []
sqlall = "select * from mytable"

for chunk in pd.read_sql_query(sqlall , cnxn, chunksize=10000):
    dfs.append(chunk)

Thao tác này trả về danh sách các khung dữ liệu

type(dfs[0])
Out[6]: pandas.core.frame.DataFrame

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

Đây là một số dữ liệu mẫu

# sample dataframes
d1 = pd.DataFrame({'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]})
d2 = pd.DataFrame({'one' : [5., 6., 7., 8.], 'two' : [9., 10., 11., 12.]})
d3 = pd.DataFrame({'one' : [15., 16., 17., 18.], 'two' : [19., 10., 11., 12.]})

# list of dataframes
mydfs = [d1, d2, d3]

Tôi muốn kết hợp d1, d2d3vào một gấu trúc dataframe. Ngoài ra, một phương pháp đọc bảng lớn trực tiếp vào khung dữ liệu khi sử dụng chunksizetùy chọn sẽ rất hữu ích.

Câu trả lời:


244

Cho rằng tất cả các khung dữ liệu đều có các cột giống nhau, bạn có thể chỉ cần concatchúng:

import pandas as pd
df = pd.concat(list_of_dataframes)

1
nếu chúng không có cùng các cột, bạn có thể chuyển chúng thành một chính tả trước rồi sử dụng from_dict - xem bên dưới
meyerson

1
nếu bạn muốn thêm cột, hãy nhớ thêm đối số trục = 1
ford prefect

3
Tôi đoán, ngay cả khi một số data.framekhông có cùng một cột sau đó NaNsẽ được chèn mà không ném lỗi trong phiên bản mới củapandas
joel.wilson

7

Nếu các khung dữ liệu KHÔNG có các cột giống nhau, hãy thử cách sau:

df = pd.DataFrame.from_dict(map(dict,df_list))

7
Giải pháp này không hoạt động với tôi trên Python 3.6.5 / Pandas v0.23.0. Nó có lỗi với TypeError: data argument can't be an iterator. Việc chuyển đổi thành listđầu tiên (để bắt chước Python 2.7) cũng mang lại kết quả bất ngờ.
jpp

và nếu tất cả các khung dữ liệu có cùng một cột, chúng ta phải làm thế nào?
Thony Nadhir

6

Bạn cũng có thể làm điều đó với lập trình chức năng:

from functools import reduce
reduce(lambda df1, df2: df1.merge(df2, "outer"), mydfs)

2
from functools import reduceđể sử dụngreduce
nishant

Bạn không nên thực hiện hợp nhất từng cặp cho nhiều DataFrame, nó không hiệu quả chút nào. Xem pd.concathoặc join, cả hai đều chấp nhận danh sách các khung và tham gia vào chỉ mục theo mặc định.
cs95

0

concat cũng hoạt động hiệu quả với khả năng hiểu danh sách được kéo bằng lệnh "loc" đối với khung dữ liệu hiện có

df = pd.read_csv('./data.csv') # ie; Dataframe pulled from csv file with a "userID" column

review_ids = ['1','2','3'] # ie; ID values to grab from DataFrame

# Gets rows in df where IDs match in the userID column and combines them 

dfa = pd.concat([df.loc[df['userID'] == x] for x in review_ids])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.