เชื่อมต่อรายการดาต้าเฟรมของแพนด้าเข้าด้วยกัน


129

ฉันมีรายการดาต้าเฟรมของ Pandas ที่อยากจะรวมไว้ในดาต้าเฟรมของ Pandas ฉันใช้ Python 2.7.10 และ Pandas 0.16.2

ฉันสร้างรายการดาต้าเฟรมจาก:

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

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

สิ่งนี้ส่งคืนรายการของดาต้าเฟรม

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

type(dfs)
Out[7]: list

len(dfs)
Out[8]: 408

นี่คือข้อมูลตัวอย่างบางส่วน

# 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]

ฉันต้องการที่จะรวมd1, d2และd3เป็นหนึ่งหมีแพนด้า dataframe อีกวิธีหนึ่งคือวิธีการอ่านตารางขนาดใหญ่ลงในดาต้าเฟรมโดยตรงเมื่อใช้chunksizeตัวเลือกนี้จะมีประโยชน์มาก

คำตอบ:


244

เนื่องจากดาต้าเฟรมทั้งหมดมีคอลัมน์เดียวกันคุณสามารถทำได้ง่ายๆconcat:

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

1
หากไม่มีคอลัมน์เดียวกันคุณสามารถส่งให้เป็น dict ก่อนจากนั้นใช้ from_dict - ดูด้านล่าง
meyerson

1
หากคุณต้องการเพิ่มคอลัมน์อย่าลืมเพิ่มแกน = 1 อาร์กิวเมนต์
ฟอร์ดนายอำเภอ

3
ฉันเดาว่าแม้ว่าบางdata.frameคอลัมน์NaNจะไม่มีคอลัมน์เหมือนกัน แต่ก็จะถูกแทรกโดยไม่มีข้อผิดพลาดในเวอร์ชันใหม่ของpandas
joel.wilson

7

หากดาต้าเฟรมไม่มีคอลัมน์เดียวกันทั้งหมดให้ลองทำดังต่อไปนี้:

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

7
วิธีนี้ใช้ไม่ได้กับฉันใน Python 3.6.5 / Pandas v0.23.0 มันเกิดข้อผิดพลาดกับTypeError: data argument can't be an iterator. การแปลงเป็นlistอันดับแรก (เพื่อเลียนแบบ Python 2.7) ก็ให้ผลลัพธ์ที่ไม่คาดคิดเช่นกัน
jpp

และถ้า dataframes ทั้งหมดมีคอลัมน์เดียวกันเราจะทำอย่างไร?
Thony Nadhir

6

คุณสามารถทำได้ด้วยการเขียนโปรแกรมเชิงฟังก์ชัน:

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

2
from functools import reduceที่จะใช้reduce
nishant

ไม่แนะนำให้ทำการผสานแบบคู่สำหรับหลาย DataFrames แต่จะไม่มีประสิทธิภาพเลย ดูpd.concatหรือjoinทั้งสองยอมรับรายการเฟรมและเข้าร่วมในดัชนีตามค่าเริ่มต้น
cs95

0

concat ยังใช้งานได้ดีกับความเข้าใจรายการที่ดึงโดยใช้คำสั่ง "loc" เทียบกับดาต้าเฟรมที่มีอยู่

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])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.