ใช้ Pandas เพื่อ pd.read_excel () สำหรับหลายแผ่นงานของสมุดงานเดียวกัน


167

ฉันมีไฟล์สเปรดชีตขนาดใหญ่ (.xlsx) ที่ฉันกำลังประมวลผลโดยใช้ python python มันเกิดขึ้นที่ฉันต้องการข้อมูลจากสองแท็บในไฟล์ขนาดใหญ่นั้น หนึ่งในแท็บมีข้อมูลมากมายและอีกแท็บหนึ่งมีเพียงไม่กี่ตารางเซลล์

เมื่อฉันใช้pd.read_excel ()บนแผ่นงานใด ๆฉันรู้สึกว่าไฟล์ทั้งหมดถูกโหลด (ไม่ใช่แค่แผ่นงานที่ฉันสนใจ) ดังนั้นเมื่อฉันใช้วิธีสองครั้ง (หนึ่งครั้งสำหรับแต่ละแผ่นงาน) ฉันต้องประสบกับเวิร์กบุ๊กทั้งเล่มที่อ่านเป็นสองเท่า (แม้ว่าเราจะใช้แผ่นงานที่ระบุเท่านั้น)

ฉันใช้มันผิดหรือถูก จำกัด ด้วยวิธีนี้หรือไม่?

ขอบคุณ!


คำตอบ:


246

ลองpd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

ตามที่บันทึกไว้โดย @HaPsantran ไฟล์ Excel ทั้งหมดจะถูกอ่านในระหว่าง ExcelFile()โทร (ดูเหมือนจะไม่มีทางแก้ไข) สิ่งนี้ช่วยให้คุณไม่ต้องอ่านไฟล์เดียวกันทุกครั้งที่คุณต้องการเข้าถึงชีตใหม่

โปรดทราบว่าsheet_nameข้อโต้แย้งที่จะpd.read_excel()สามารถเป็นชื่อของแผ่น (ข้างต้น) เป็นจำนวนเต็มระบุจำนวนแผ่น (เช่น 0, 1, ฯลฯ ) Noneรายชื่อแผ่นหรือดัชนีหรือ หากมีการจัดทำรายการไว้จะส่งคืนพจนานุกรมโดยที่คีย์คือชื่อชีต / ดัชนีและค่าเป็นเฟรมข้อมูล ค่าเริ่มต้นคือการคืนค่าแผ่นงานแรก (เช่นsheet_name=0 )

หากNoneระบุไว้ชีตทั้งหมดจะถูกส่งคืนเป็น{sheet_name:dataframe}พจนานุกรม


4
FWIW ดูเหมือนว่า (ครั้งสุดท้ายที่ฉันทดสอบ) การโหลดบรรทัดแรกในทุกสิ่งดังนั้นจึงไม่มีวิธีที่จะดึงกระดาษได้อย่างมีประสิทธิภาพเพียงแผ่นเดียว แต่อย่างน้อยการรับกระดาษหลายแผ่นไม่ต้องโหลดหลายแผ่น
HaPsantran

1
คำตอบนี้เลิกใช้แล้วโดย pandas และตอนนี้ล่มสำหรับฉันใน v0.21.0 ควรแทนที่ด้วย @ Mat0kan ที่กำหนดให้
DStauffman

1
@DSauffman นี้ยังใช้งานได้ดีสำหรับฉันและฉันไม่เห็นสิ่งบ่งชี้จากรหัสหรือเอกสารที่เลิกใช้แล้ว หากคุณมีปัญหากับมันฉันจะส่งปัญหาบน github สำหรับ pandas หรือ xlrd (python excel parsing library ที่ pandas ใช้)
Noah

@Noah ขอบคุณผมมองเป็นแบบนี้บางมากขึ้นและคุณขวาก็จะยังคงทำงานได้นานเท่าที่ผมใช้และไม่ได้sheet_name sheetnameฉันไม่ทราบว่าเป็นส่วนที่คัดค้านเพราะมันยังคงทำงานในวิธี read_excel แต่ไม่ได้อยู่ในวิธีวิเคราะห์คำ
DStauffman

@Noah คำตอบที่ดีแน่นอน มีวิธีการค้นหาเซลล์ที่ใช้งานอยู่ในแผ่นงาน excel ที่คุณอ่านหรือไม่?
Eswar

97

มี 3 ตัวเลือก:

อ่านชีตทั้งหมดลงในพจนานุกรมที่สั่งซื้อโดยตรง

import pandas as pd

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

ขอบคุณ @ihightower สำหรับการชี้ให้เห็นและ @toto_tico สำหรับการชี้ปัญหารุ่น

อ่านแผ่นงานแรกโดยตรงใน dataframe

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

อ่านไฟล์ excel และรับรายการชีต จากนั้นเลือกและโหลดแผ่น

xls = pd.ExcelFile('excel_file_path.xls')

# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]

# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheetname="house")

อ่านชีตทั้งหมดและเก็บไว้ในพจนานุกรม เหมือนกับครั้งแรก แต่ชัดเจนกว่า

# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)

อัปเดต: ขอบคุณ @toto_tico สำหรับการชี้ให้เห็นปัญหารุ่น

sheetname: string, int, รายการผสมของสตริง / ints หรือ None, ค่าดีฟอลต์ 0 เลิกใช้แล้วตั้งแต่รุ่น 0.21.0: ใช้ sheet_name แทนSource Link


12
ใน pandas ล่าสุดที่ฉันมี (0.20.3) เพื่ออ่านชีตทั้งหมดไปยังแผนที่ .. สิ่งที่จำเป็นต้องมีก็คือdf_sheet_map = pd.read_excel(file_fullpath, sheetname=None)นี้จะมีชีตในพจนานุกรมโดยอัตโนมัติ .. และเข้าถึงชีทเป็น dataframe ดังนี้:df_sheet_map['house']
ihightower

32

คุณยังสามารถใช้ดัชนีสำหรับชีตได้:

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

จะให้แผ่นงานแรก สำหรับแผ่นงานที่สอง:

sheet2 = xls.parse(1)

7
ในกรณีที่คุณต้องการรายการของชื่อชีตมากกว่าแค่พิมพ์ xls.sheet_names
Stefano Fedele

28

คุณสามารถระบุชื่อชีตเป็นพารามิเตอร์:

data_file = pd.read_excel('path_to_file.xls', sheet_name="sheet_name")

"sheet_name"จะอัปโหลดเฉพาะแผ่น


9
pd.read_excel('filename.xlsx') 

โดยค่าเริ่มต้นอ่านแผ่นงานแรกของสมุดงาน

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

อ่านแผ่นงานเฉพาะและ

pd.read_excel('filename.xlsx', sheet_name = None) 

อ่านเวิร์กชีตทั้งหมดจาก excel ไปยัง pandas dataframe เป็นประเภทของ OrderedDict หมายถึงซ้อนดาตาฟาเรตแผ่นงานทั้งหมดเป็น dataframes ที่รวบรวมภายใน dataframe และประเภทนั้นคือ OrderedDict


1

ใช่น่าเสียดายที่มันจะโหลดไฟล์เต็มเสมอ หากคุณทำเช่นนี้ซ้ำ ๆ อาจเป็นการดีที่สุดที่จะแยกแผ่นงานเพื่อแยก CSV แล้วโหลดแยกต่างหาก คุณสามารถทำให้กระบวนการนั้นเป็นแบบอัตโนมัติด้วยd6tstackซึ่งยังเพิ่มคุณสมบัติเพิ่มเติมเช่นการตรวจสอบว่าคอลัมน์ทั้งหมดเท่ากันในชีตทั้งหมดหรือไฟล์ Excel หลายไฟล์

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

ดูตัวอย่าง d6tstack Excel


0

หากคุณบันทึกไฟล์ excel ไว้ในโฟลเดอร์เดียวกับโปรแกรมไพ ธ อนของคุณ (Relative Addressing) คุณเพียงแค่พูดถึงหมายเลขชีตพร้อมกับชื่อไฟล์ ไวยากรณ์ = pd.read_excel (ชื่อไฟล์, SheetNo) ตัวอย่าง:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.