ในกระบวนการตอบคำถามนี้สำหรับตัวฉันเองฉันได้เรียนรู้หลายสิ่งหลายอย่างและฉันต้องการรวบรวมแคตตาล็อกตัวอย่างและคำอธิบายบางส่วน
คำตอบเฉพาะของประเด็นlevels
โต้แย้งจะมาถึงจุดสิ้นสุด
pandas.concat
: คู่มือที่หายไป
ลิงก์ไปยังเอกสารปัจจุบัน
นำเข้าและกำหนดวัตถุ
import pandas as pd
d1 = pd.DataFrame(dict(A=.1, B=.2, C=.3), index=[2, 3])
d2 = pd.DataFrame(dict(B=.4, C=.5, D=.6), index=[1, 2])
d3 = pd.DataFrame(dict(A=.7, B=.8, D=.9), index=[1, 3])
s1 = pd.Series([1, 2], index=[2, 3])
s2 = pd.Series([3, 4], index=[1, 2])
s3 = pd.Series([5, 6], index=[1, 3])
อาร์กิวเมนต์
objs
ข้อโต้แย้งแรกที่เราพบคือobjs
:
objs : ลำดับหรือการแมปของ Series, DataFrame หรือพาเนลออบเจ็กต์หากส่งคำสั่งไปแล้วคีย์ที่เรียงลำดับจะถูกใช้เป็นอาร์กิวเมนต์ของคีย์เว้นแต่จะมีการส่งผ่านซึ่งในกรณีนี้ค่าจะถูกเลือก (ดูด้านล่าง) วัตถุใด ๆ ที่ไม่มีจะถูกทิ้งอย่างเงียบ ๆ เว้นแต่ว่าจะไม่มีทั้งหมดซึ่งในกรณีนี้จะมีการเพิ่ม ValueError
- โดยทั่วไปเราจะเห็นสิ่งนี้ใช้กับรายการ
Series
หรือDataFrame
วัตถุ
- ฉันจะแสดงให้เห็นว่า
dict
มีประโยชน์มากเช่นกัน
- เครื่องกำเนิดไฟฟ้าอาจใช้และมีประโยชน์เมื่อใช้งาน
map
เช่นกันmap(f, list_of_df)
สำหรับตอนนี้เราจะติดรายการของDataFrame
และSeries
วัตถุบางส่วนที่กำหนดไว้ด้านบน ฉันจะแสดงให้เห็นว่าพจนานุกรมสามารถใช้ประโยชน์ได้อย่างไรเพื่อให้ได้MultiIndex
ผลลัพธ์ที่มีประโยชน์มากในภายหลัง
pd.concat([d1, d2])
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
axis
อาร์กิวเมนต์ที่สองที่เราพบคือaxis
ค่าเริ่มต้นคือ0
:
แกน : {0 / 'ดัชนี', 1 / 'คอลัมน์'}, ค่าเริ่มต้น 0 แกนที่จะเชื่อมต่อกัน
สองDataFrame
วินาทีกับaxis=0
(ซ้อนกัน)
สำหรับค่า0
หรือindex
เราหมายถึงการพูดว่า: "จัดแนวตามคอลัมน์และเพิ่มลงในดัชนี"
ดังที่แสดงไว้ด้านบนที่เราใช้axis=0
เนื่องจาก0
เป็นค่าเริ่มต้นและเราเห็นว่าดัชนีของการd2
ขยายดัชนีd1
แม้ว่าจะมีการทับซ้อนกันของค่า2
:
pd.concat([d1, d2], axis=0)
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
สองคนDataFrame
กับaxis=1
(เคียงข้างกัน)
สำหรับค่า1
หรือcolumns
เราหมายถึงการพูดว่า: "จัดแนวตามดัชนีและเพิ่มลงในคอลัมน์"
pd.concat([d1, d2], axis=1)
A B C B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
เราจะเห็นว่าดัชนีที่เกิดขึ้นเป็นสหภาพของดัชนีและคอลัมน์ที่เกิดขึ้นเป็นส่วนขยายของคอลัมน์จากคอลัมน์ของd1
d2
สอง (หรือสาม) Series
กับaxis=0
(ซ้อนกัน)
เมื่อรวมpandas.Series
ตามที่เราได้รับกลับมาaxis=0
pandas.Series
ชื่อของผลลัพธ์Series
จะเป็นNone
เว้นแต่ว่าทั้งหมดSeries
ที่รวมกันมีชื่อเดียวกัน ให้ความสนใจกับเมื่อเราพิมพ์ออกผล'Name: A'
Series
เมื่อมันไม่เป็นปัจจุบันเราสามารถเอาชื่อSeries
None
| | | pd.concat(
| pd.concat( | pd.concat( | [s1.rename('A'),
pd.concat( | [s1.rename('A'), | [s1.rename('A'), | s2.rename('B'),
[s1, s2]) | s2]) | s2.rename('A')]) | s3.rename('A')])
-------------- | --------------------- | ---------------------- | ----------------------
2 1 | 2 1 | 2 1 | 2 1
3 2 | 3 2 | 3 2 | 3 2
1 3 | 1 3 | 1 3 | 1 3
2 4 | 2 4 | 2 4 | 2 4
dtype: int64 | dtype: int64 | Name: A, dtype: int64 | 1 5
| | | 3 6
| | | dtype: int64
สอง (หรือสาม) Series
กับaxis=1
(เคียงข้างกัน)
เมื่อรวมpandas.Series
พร้อมaxis=1
มันเป็นแอตทริบิวต์ที่เราดูเพื่อที่จะสรุปชื่อคอลัมน์ในที่เกิดname
pandas.DataFrame
| | pd.concat(
| pd.concat( | [s1.rename('X'),
pd.concat( | [s1.rename('X'), | s2.rename('Y'),
[s1, s2], axis=1) | s2], axis=1) | s3.rename('Z')], axis=1)
---------------------- | --------------------- | ------------------------------
0 1 | X 0 | X Y Z
1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 5.0
2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 NaN
3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN 6.0
ผสมSeries
และDataFrame
กับaxis=0
(ซ้อนกัน)
เมื่อทำการเชื่อมต่อของ a Series
และDataFrame
พร้อมaxis=0
เราจะแปลงทั้งหมดSeries
เป็นคอลัมน์เดียวDataFrame
s
จดพิเศษที่ว่านี้คือการเรียงต่อกันพร้อมaxis=0
; นั่นหมายถึงการขยายดัชนี (แถว) ในขณะที่จัดแนวคอลัมน์ ในตัวอย่างด้านล่างเราจะเห็นดัชนีกลายเป็นดัชนี[2, 3, 2, 3]
ที่ต่อท้ายดัชนีโดยไม่เลือกปฏิบัติ คอลัมน์จะไม่ทับซ้อนกันเว้นแต่ฉันจะบังคับให้ตั้งชื่อSeries
คอลัมน์ด้วยอาร์กิวเมนต์เป็นto_frame
:
pd.concat( |
[s1.to_frame(), d1]) | pd.concat([s1, d1])
------------------------- | ---------------------
0 A B C | 0 A B C
2 1.0 NaN NaN NaN | 2 1.0 NaN NaN NaN
3 2.0 NaN NaN NaN | 3 2.0 NaN NaN NaN
2 NaN 0.1 0.2 0.3 | 2 NaN 0.1 0.2 0.3
3 NaN 0.1 0.2 0.3 | 3 NaN 0.1 0.2 0.3
คุณสามารถเห็นผลลัพธ์ของpd.concat([s1, d1])
มันเหมือนกับว่าฉันได้ทำให้to_frame
ตัวเองสมบูรณ์แบบ
to_frame
แต่ผมสามารถควบคุมชื่อของคอลัมน์ที่เกิดกับพารามิเตอร์ไป การเปลี่ยนชื่อSeries
ด้วยrename
วิธีการที่ไม่ได้DataFrame
ควบคุมชื่อคอลัมน์ในที่เกิด
pd.concat( | pd.concat( | pd.concat(
[s1.to_frame('X'), d1]) | [s1.rename('X'), d1]) | [s1.to_frame('B'), d1])
---------------------------- | -------------------------- | ----------------------------
A B C X | 0 A B C | A B C
2 NaN NaN NaN 1.0 | 2 1.0 NaN NaN NaN | 2 NaN 1.0 NaN
3 NaN NaN NaN 2.0 | 3 2.0 NaN NaN NaN | 3 NaN 2.0 NaN
2 0.1 0.2 0.3 NaN | 2 NaN 0.1 0.2 0.3 | 2 0.1 0.2 0.3
3 0.1 0.2 0.3 NaN | 3 NaN 0.1 0.2 0.3 | 3 0.1 0.2 0.3
ผสมSeries
และDataFrame
ด้วยaxis=1
(เคียงข้างกัน)
นี่ค่อนข้างใช้งานง่าย Series
ชื่อคอลัมน์มีค่าเริ่มต้นเป็นการแจงนับของอSeries
อบเจ็กต์ดังกล่าวเมื่อไม่มีname
แอตทริบิวต์
| pd.concat(
pd.concat( | [s1.rename('X'),
[s1, d1], | s2, s3, d1],
axis=1) | axis=1)
------------------- | -------------------------------
0 A B C | X 0 1 A B C
2 1 0.1 0.2 0.3 | 1 NaN 3.0 5.0 NaN NaN NaN
3 2 0.1 0.2 0.3 | 2 1.0 4.0 NaN 0.1 0.2 0.3
| 3 2.0 NaN 6.0 0.1 0.2 0.3
join
อาร์กิวเมนต์ที่สามคือการjoin
อธิบายว่าการผสานผลลัพธ์ควรเป็นการผสานภายนอก (ค่าเริ่มต้น) หรือการผสานภายใน
join : {'inner', 'outer'}, default 'outer'
วิธีจัดการดัชนีบนแกนอื่น ๆ
ปรากฎว่าไม่มีleft
หรือright
ตัวเลือกใดที่pd.concat
สามารถจัดการกับวัตถุมากกว่าสองชิ้นเพื่อรวมเข้าด้วยกัน
ในกรณีd1
และd2
ตัวเลือกมีลักษณะดังนี้:
outer
pd.concat([d1, d2], axis=1, join='outer')
A B C B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
inner
pd.concat([d1, d2], axis=1, join='inner')
A B C B C D
2 0.1 0.2 0.3 0.4 0.5 0.6
join_axes
ข้อโต้แย้งประการที่สี่คือสิ่งที่ช่วยให้เราทำการleft
ผสานและอื่น ๆ
join_axes : รายการดัชนีวัตถุ
ดัชนีเฉพาะที่จะใช้สำหรับแกน n - 1 อื่น ๆ แทนการใช้ตรรกะชุดภายใน / ภายนอก
ผสานซ้าย
pd.concat([d1, d2, d3], axis=1, join_axes=[d1.index])
A B C B C D A B D
2 0.1 0.2 0.3 0.4 0.5 0.6 NaN NaN NaN
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
ผสานขวา
pd.concat([d1, d2, d3], axis=1, join_axes=[d3.index])
A B C B C D A B D
1 NaN NaN NaN 0.4 0.5 0.6 0.7 0.8 0.9
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
ignore_index
Ignore_index : boolean ค่าเริ่มต้น False
If True อย่าใช้ค่าดัชนีตามแกนการเรียงต่อกัน แกนผลลัพธ์จะมีป้ายกำกับว่า 0, ... , n - 1 สิ่งนี้มีประโยชน์หากคุณกำลังต่อวัตถุที่แกนการเรียงต่อกันไม่มีข้อมูลการทำดัชนีที่มีความหมาย โปรดสังเกตว่าค่าดัชนีบนแกนอื่น ๆ ยังคงเคารพในการรวม
เช่นเดียวกับเมื่อฉันแต็คd1
ที่ด้านบนของd2
ถ้าฉันไม่สนใจเกี่ยวกับค่าดัชนีฉันจะรีเซ็ตพวกเขาหรือไม่สนใจพวกเขา
| pd.concat( | pd.concat(
| [d1, d2], | [d1, d2]
pd.concat([d1, d2]) | ignore_index=True) | ).reset_index(drop=True)
--------------------- | ----------------------- | -------------------------
A B C D | A B C D | A B C D
2 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN | 0 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN | 1 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6 | 2 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6 | 3 NaN 0.4 0.5 0.6
และเมื่อใช้axis=1
:
| pd.concat(
| [d1, d2], axis=1,
pd.concat([d1, d2], axis=1) | ignore_index=True)
------------------------------- | -------------------------------
A B C B C D | 0 1 2 3 4 5
1 NaN NaN NaN 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN | 3 0.1 0.2 0.3 NaN NaN NaN
keys
เราสามารถส่งรายการค่าสเกลาร์หรือทูเพิลเพื่อกำหนดค่าทูเพิลหรือสเกลาร์ให้กับ MultiIndex ที่เกี่ยวข้อง ความยาวของรายการที่ส่งผ่านจะต้องมีความยาวเท่ากับจำนวนรายการที่ต่อกัน
คีย์ : ลำดับค่าเริ่มต้นไม่มี
หากผ่านไปหลายระดับควรมีทูเปิล สร้างดัชนีลำดับชั้นโดยใช้ปุ่มที่ผ่านเป็นระดับนอกสุด
axis=0
เมื่อต่อSeries
วัตถุเข้าด้วยกันaxis=0
(ขยายดัชนี)
คีย์เหล่านั้นกลายเป็นระดับเริ่มต้นใหม่ของMultiIndex
อ็อบเจ็กต์ในแอตทริบิวต์ดัชนี
pd.concat([s1, s2, s3], keys=['A', 'B', 'C']) pd.concat([s1, s2], keys=['A', 'B'])
---------------------------------------------- -------------------------------------
A 2 1 A 2 1
3 2 3 2
B 1 3 B 1 3
2 4 2 4
C 1 5 dtype: int64
3 6
dtype: int64
อย่างไรก็ตามเราสามารถใช้มากกว่าค่าสเกลาร์ในkeys
อาร์กิวเมนต์เพื่อสร้างMultiIndex
. ที่นี่เราส่งต่อtuples
ความยาว 2 ก่อนหน้าสองระดับใหม่ของ a MultiIndex
:
pd.concat(
[s1, s2, s3],
keys=[('A', 'X'), ('A', 'Y'), ('B', 'X')])
-----------------------------------------------
A X 2 1
3 2
Y 1 3
2 4
B X 1 5
3 6
dtype: int64
axis=1
แตกต่างกันเล็กน้อยเมื่อขยายตามคอลัมน์ เมื่อเราใช้axis=0
(ดูด้านบน) การkeys
กระทำของเราเป็นMultiIndex
ระดับนอกเหนือจากดัชนีที่มีอยู่ สำหรับaxis=1
เรากำลังอ้างถึงแกนที่Series
วัตถุไม่มีนั่นคือcolumns
แอตทริบิวต์
รูปแบบของสอง
Series
wtih
axis=1
สังเกตว่าการตั้งชื่อs1
และมีความs2
สำคัญตราบเท่าที่ไม่มีการkeys
ส่งผ่าน แต่จะถูกแทนที่หากkeys
มีการส่งผ่าน
| | | pd.concat(
| pd.concat( | pd.concat( | [s1.rename('U'),
pd.concat( | [s1, s2], | [s1.rename('U'), | s2.rename('V')],
[s1, s2], | axis=1, | s2.rename('V')], | axis=1,
axis=1) | keys=['X', 'Y']) | axis=1) | keys=['X', 'Y'])
-------------- | --------------------- | ---------------------- | ----------------------
0 1 | X Y | U V | X Y
1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0 | 1 NaN 3.0
2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0 | 2 1.0 4.0
3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN | 3 2.0 NaN
MultiIndex
ด้วย
Series
และ
axis=1
pd.concat(
[s1, s2],
axis=1,
keys=[('W', 'X'), ('W', 'Y')])
-----------------------------------
W
X Y
1 NaN 3.0
2 1.0 4.0
3 2.0 NaN
สอง
DataFrame
กับ
axis=1
เช่นเดียวกับaxis=0
ตัวอย่างให้keys
เพิ่มระดับให้กับ a MultiIndex
แต่คราวนี้ให้กับวัตถุที่เก็บไว้ในcolumns
แอตทริบิวต์
pd.concat( | pd.concat(
[d1, d2], | [d1, d2],
axis=1, | axis=1,
keys=['X', 'Y']) | keys=[('First', 'X'), ('Second', 'X')])
------------------------------- | --------------------------------------------
X Y | First Second
A B C B C D | X X
1 NaN NaN NaN 0.4 0.5 0.6 | A B C B C D
2 0.1 0.2 0.3 0.4 0.5 0.6 | 1 NaN NaN NaN 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN | 2 0.1 0.2 0.3 0.4 0.5 0.6
| 3 0.1 0.2 0.3 NaN NaN NaN
Series
และ
DataFrame
ด้วย
axis=1
นี่เป็นเรื่องยุ่งยาก ในกรณีนี้ค่าคีย์สเกลาร์ไม่สามารถทำหน้าที่เป็นดัชนีระดับเดียวสำหรับSeries
ออบเจ็กต์ได้เมื่อมันกลายเป็นคอลัมน์ในขณะที่ทำหน้าที่เป็นระดับแรกของ a MultiIndex
สำหรับDataFrame
. ดังนั้น Pandas จะใช้name
แอตทริบิวต์ของSeries
วัตถุเป็นที่มาของชื่อคอลัมน์อีกครั้ง
pd.concat( | pd.concat(
[s1, d1], | [s1.rename('Z'), d1],
axis=1, | axis=1,
keys=['X', 'Y']) | keys=['X', 'Y'])
--------------------- | --------------------------
X Y | X Y
0 A B C | Z A B C
2 1 0.1 0.2 0.3 | 2 1 0.1 0.2 0.3
3 2 0.1 0.2 0.3 | 3 2 0.1 0.2 0.3
ข้อ จำกัด
keys
และการ
MultiIndex
อนุมาน
Pandas ดูเหมือนจะอนุมานชื่อคอลัมน์จากSeries
ชื่อเท่านั้น แต่จะไม่เติมในช่องว่างเมื่อทำการเชื่อมต่อแบบอะนาล็อกระหว่างเฟรมข้อมูลที่มีระดับคอลัมน์ที่แตกต่างกัน
d1_ = pd.concat(
[d1], axis=1,
keys=['One'])
d1_
One
A B C
2 0.1 0.2 0.3
3 0.1 0.2 0.3
จากนั้นเชื่อมต่อกับกรอบข้อมูลอื่นที่มีเพียงระดับเดียวในออบเจ็กต์คอลัมน์และ Pandas จะปฏิเสธที่จะลองสร้างสิ่งที่เป็นMultiIndex
วัตถุและรวมกรอบข้อมูลทั้งหมดราวกับว่าเป็นวัตถุระดับเดียวสเกลาร์และสิ่งทอ
pd.concat([d1_, d2], axis=1)
(One, A) (One, B) (One, C) B C D
1 NaN NaN NaN 0.4 0.5 0.6
2 0.1 0.2 0.3 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN NaN NaN
ผ่าน a dict
แทน alist
เมื่อผ่านพจนานุกรมpandas.concat
จะใช้คีย์จากพจนานุกรมเป็นkeys
พารามิเตอร์
pd.concat( | pd.concat(
{0: d1, 1: d2}) | {0: d1, 1: d2}, axis=1)
----------------------- | -------------------------------
A B C D | 0 1
0 2 0.1 0.2 0.3 NaN | A B C B C D
3 0.1 0.2 0.3 NaN | 1 NaN NaN NaN 0.4 0.5 0.6
1 1 NaN 0.4 0.5 0.6 | 2 0.1 0.2 0.3 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaN
levels
สิ่งนี้ใช้ร่วมกับkeys
อาร์กิวเมนต์เมื่อlevels
ถูกปล่อยให้เป็นค่าเริ่มต้นของNone
มัน Pandas จะรับค่าที่ไม่ซ้ำกันของแต่ละระดับของผลลัพธ์MultiIndex
และใช้เป็นวัตถุที่ใช้ในindex.levels
แอตทริบิวต์ผลลัพธ์
ระดับ : รายการลำดับเริ่มต้นไม่มี
ระดับเฉพาะ (ค่าที่ไม่ซ้ำกัน) เพื่อใช้ในการสร้าง MultiIndex มิฉะนั้นจะถูกอนุมานจากคีย์
ถ้าแพนด้าสรุปได้แล้วว่าระดับเหล่านี้ควรเป็นอย่างไรจะมีประโยชน์อะไรที่จะระบุได้เอง? ฉันจะแสดงตัวอย่างและปล่อยให้คุณคิดเหตุผลอื่น ๆ ที่อาจเป็นประโยชน์
ตัวอย่าง
ตามเอกสารประกอบlevels
อาร์กิวเมนต์คือรายการของลำดับ ซึ่งหมายความว่าเราสามารถใช้อีกpandas.Index
อันหนึ่งเป็นหนึ่งในลำดับเหล่านั้นได้
พิจารณากรอบข้อมูลdf
ที่เป็น concatenation ของd1
, d2
และd3
:
df = pd.concat(
[d1, d2, d3], axis=1,
keys=['First', 'Second', 'Fourth'])
df
First Second Fourth
A B C B C D A B D
1 NaN NaN NaN 0.4 0.5 0.6 0.7 0.8 0.9
2 0.1 0.2 0.3 0.4 0.5 0.6 NaN NaN NaN
3 0.1 0.2 0.3 NaN NaN NaN 0.7 0.8 0.9
ระดับของวัตถุคอลัมน์คือ:
print(df, *df.columns.levels, sep='\n')
Index(['First', 'Second', 'Fourth'], dtype='object')
Index(['A', 'B', 'C', 'D'], dtype='object')
หากเราใช้sum
ภายในgroupby
เราจะได้รับ:
df.groupby(axis=1, level=0).sum()
First Fourth Second
1 0.0 2.4 1.5
2 0.6 0.0 1.5
3 0.6 2.4 0.0
แต่สิ่งที่ถ้าแทนที่จะ['First', 'Second', 'Fourth']
มีคนอีกประเภทที่หายไปชื่อThird
และFifth
? และฉันต้องการให้รวมอยู่ในผลลัพธ์ของการgroupby
รวม? เราสามารถทำได้ถ้าเรามีไฟล์pandas.CategoricalIndex
. และเราสามารถระบุสิ่งนั้นล่วงหน้าพร้อมกับlevels
อาร์กิวเมนต์ได้
ดังนั้นให้กำหนดdf
เป็น:
cats = ['First', 'Second', 'Third', 'Fourth', 'Fifth']
lvl = pd.CategoricalIndex(cats, categories=cats, ordered=True)
df = pd.concat(
[d1, d2, d3], axis=1,
keys=['First', 'Second', 'Fourth'],
levels=[lvl]
)
df
First Fourth Second
1 0.0 2.4 1.5
2 0.6 0.0 1.5
3 0.6 2.4 0.0
แต่ระดับแรกของวัตถุคอลัมน์คือ:
df.columns.levels[0]
CategoricalIndex(
['First', 'Second', 'Third', 'Fourth', 'Fifth'],
categories=['First', 'Second', 'Third', 'Fourth', 'Fifth'],
ordered=True, dtype='category')
และการgroupby
สรุปของเราดูเหมือนว่า:
df.groupby(axis=1, level=0).sum()
First Second Third Fourth Fifth
1 0.0 1.5 0.0 2.4 0.0
2 0.6 1.5 0.0 0.0 0.0
3 0.6 0.0 0.0 2.4 0.0
names
MultiIndex
นี้จะใช้ชื่อในระดับที่ส่งผล ความยาวของรายการควรจะตรงกับจำนวนของระดับในที่เกิดnames
MultiIndex
ชื่อ : รายการค่าเริ่มต้น None
Names สำหรับระดับในดัชนีลำดับชั้นที่เป็นผลลัพธ์
pd.concat( | pd.concat(
[d1, d2], | [d1, d2],
keys=[0, 1], | axis=1, keys=[0, 1],
names=['lvl0', 'lvl1']) | names=['lvl0', 'lvl1'])
----------------------------- | ----------------------------------
A B C D | lvl0 0 1
lvl0 lvl1 | lvl1 A B C B C D
0 2 0.1 0.2 0.3 NaN | 1 NaN NaN NaN 0.4 0.5 0.6
3 0.1 0.2 0.3 NaN | 2 0.1 0.2 0.3 0.4 0.5 0.6
1 1 NaN 0.4 0.5 0.6 | 3 0.1 0.2 0.3 NaN NaN NaN
2 NaN 0.4 0.5 0.6 |
verify_integrity
เอกสารอธิบายตนเอง
Verify_integrity : boolean, default False
ตรวจสอบว่าแกนที่ต่อกันใหม่มีรายการที่ซ้ำกันหรือไม่ ซึ่งอาจมีราคาแพงมากเมื่อเทียบกับการต่อข้อมูลจริง
เนื่องจากดัชนีผลลัพธ์จากการเรียงต่อกันd1
และd2
ไม่ซ้ำกันจึงทำให้การตรวจสอบความสมบูรณ์ล้มเหลว
pd.concat([d1, d2])
A B C D
2 0.1 0.2 0.3 NaN
3 0.1 0.2 0.3 NaN
1 NaN 0.4 0.5 0.6
2 NaN 0.4 0.5 0.6
และ
pd.concat([d1, d2], verify_integrity=True)
> ValueError: ดัชนีมีค่าที่ทับซ้อนกัน: [2]