รวมสอง dataframes ตามดัชนี


160

สวัสดีฉันมีไฟล์ข้อมูลต่อไปนี้:

> df1
  id begin conditional confidence discoveryTechnique  
0 278    56       false        0.0                  1   
1 421    18       false        0.0                  1 

> df2
   concept 
0  A  
1  B

ฉันจะรวมดัชนีเข้าด้วยกันได้อย่างไร:

  id begin conditional confidence discoveryTechnique   concept 
0 278    56       false        0.0                  1  A 
1 421    18       false        0.0                  1  B

ฉันถามเพราะมันเป็นความเข้าใจของฉันว่าmerge()คือdf1.merge(df2)ใช้คอลัมน์ที่จะทำที่ตรงกัน ในความเป็นจริงการทำเช่นนี้ฉันจะได้รับ:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
    copy=copy, indicator=indicator)
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
    self._validate_specification()
  File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
    raise MergeError('No common columns to perform merge on')
pandas.tools.merge.MergeError: No common columns to perform merge on

การรวมดัชนีเข้ากันหรือไม่? มันเป็นไปไม่ได้เหรอ? ถ้าเป็นเช่นนั้นฉันจะย้ายดัชนีไปยังคอลัมน์ใหม่ที่เรียกว่า "ดัชนี" ได้อย่างไร

ขอบคุณ


3
ลองนี้:df1.join(df2)
MaxU

จะทำอย่างไรถ้าคุณต้องการเข้าร่วมโดยดัชนีหนึ่ง dataframe และคอลัมน์ของ dataframe ที่สอง (dataframe ที่สองของฉันมีคอลัมน์ที่ตรงกับ indeces ใน df แรก)
mikey

คำตอบ:


321

ใช้mergeซึ่งเป็นการรวมภายในโดยค่าเริ่มต้น:

pd.merge(df1, df2, left_index=True, right_index=True)

หรือjoinซึ่งถูกปล่อยให้เข้าร่วมโดยค่าเริ่มต้น:

df1.join(df2)

หรือconcatซึ่งเป็นการรวมภายนอกโดยค่าเริ่มต้น:

pd.concat([df1, df2], axis=1)

ตัวอย่าง :

df1 = pd.DataFrame({'a':range(6),
                    'b':[5,3,6,9,2,4]}, index=list('abcdef'))

print (df1)
   a  b
a  0  5
b  1  3
c  2  6
d  3  9
e  4  2
f  5  4

df2 = pd.DataFrame({'c':range(4),
                    'd':[10,20,30, 40]}, index=list('abhi'))

print (df2)
   c   d
a  0  10
b  1  20
h  2  30
i  3  40

#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
   a  b  c   d
a  0  5  0  10
b  1  3  1  20

#default left join
df4 = df1.join(df2)
print (df4)
   a  b    c     d
a  0  5  0.0  10.0
b  1  3  1.0  20.0
c  2  6  NaN   NaN
d  3  9  NaN   NaN
e  4  2  NaN   NaN
f  5  4  NaN   NaN

#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
     a    b    c     d
a  0.0  5.0  0.0  10.0
b  1.0  3.0  1.0  20.0
c  2.0  6.0  NaN   NaN
d  3.0  9.0  NaN   NaN
e  4.0  2.0  NaN   NaN
f  5.0  4.0  NaN   NaN
h  NaN  NaN  2.0  30.0
i  NaN  NaN  3.0  40.0

2
ดี สำหรับคนอื่นที่อ่านข้อความนี้ถ้ามันไม่ทำงานลองดูว่าคุณจำเป็นต้องใช้.transpose()หนึ่งใน dfs ของคุณเพื่อซิงค์ดัชนี - นั่นคือปัญหาของฉัน
Jona

2
ขอบคุณมาก. คำตอบที่ดี แต่ทำไมconcatต้องใส่ df ไว้ในวงเล็บในขณะที่joinและmergeไม่?
Bowen Liu

@Bowen Liu ในความคิดของฉันสำหรับเป็นไปได้ที่จะมีหลายข้อมูลใน concat ในรายการ like dfs = [df1, df2, df3,... dfn]and thendf = pd. concat(dfs)
jezrael

@jezrael คุณช่วยกรุณาตรวจสอบคำถามใหม่ของฉันที่stackoverflow.com/questions/57133848/…
Msquare

29

คุณสามารถใช้concat ([df1, df2, ... ], axis = 1)เพื่อเชื่อมต่อ DF สองตัวหรือมากกว่าที่จัดเรียงตามดัชนี:

pd.concat([df1, df2, df3, ...], axis=1)

หรือผสานสำหรับการต่อข้อมูลโดยฟิลด์ / ดัชนีที่กำหนดเอง:

# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=['col1','col3'])

# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on='col1' right_index=True)

หรือเข้าร่วมเพื่อเข้าร่วมโดยดัชนี:

 df1.join(df2)

6

โดยค่าเริ่มต้น:
joinการเข้าร่วมคอลัมน์ซ้าย
pd.mergeคือการเข้าร่วมคอลัมน์ภายใน
pd.concatเป็นการรวมนอกแถว

pd.concat:
ใช้อาร์กิวเมนต์ Iterable ดังนั้นจึงไม่สามารถใช้ DataFrames ได้โดยตรง (ใช้[df,df2])
ขนาดของ DataFrame ควรตรงตามแกน

Joinและpd.merge:
สามารถรับอาร์กิวเมนต์ DataFrame


5

ข้อผิดพลาดโง่ ๆ ที่ทำให้ฉัน: การรวมล้มเหลวเนื่องจากดัชนีdtypesแตกต่างกัน นี่ไม่ชัดเจนเนื่องจากทั้งสองตารางเป็นตารางเดือยของตารางดั้งเดิม หลังจากนั้นreset_indexดัชนีก็ดูเหมือนกันใน Jupyter มันสว่างเมื่อบันทึกลงใน Excel ...

แก้ไขด้วย: df1[['key']] = df1[['key']].apply(pd.to_numeric)

หวังว่านี่จะช่วยประหยัดเวลาได้หนึ่งชั่วโมง!


4

ถ้าหากต้องการที่จะเข้าร่วมในสอง dataframes นุ่นคุณสามารถใช้คุณลักษณะที่สามารถใช้ได้เหมือนหรือmerge concatenateตัวอย่างเช่นถ้าฉันมีสองดาต้าเกมdf1และdf2ฉันสามารถเข้าร่วมได้โดย:

newdataframe=merge(df1,df2,left_index=True,right_index=True)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.