ผนวกคอลัมน์เข้ากับฐานข้อมูลแพนด้า


109

อาจเป็นเรื่องง่าย แต่ฉันมีข้อมูลต่อไปนี้:

ในกรอบข้อมูล 1:

index dat1
0     9
1     5

ในกรอบข้อมูล 2:

index dat2
0     7
1     6

ฉันต้องการกรอบข้อมูลที่มีรูปแบบต่อไปนี้:

index dat1  dat2
0     9     7
1     5     6

ฉันได้ลองใช้appendวิธีนี้แล้ว แต่ฉันได้รับ cross join (เช่นผลิตภัณฑ์คาร์ทีเซียน)

วิธีที่ถูกต้องคืออะไร?


2
คุณลองใช้joinวิธีนี้หรือไม่?
BrenBarn

2
data_frame_1 ['dat2'] = data_frame_2 ['dat2']
lowtech

@lowtech: ตรวจสอบให้แน่ใจว่าดัชนีจับคู่อย่างถูกต้องหรือไม่?
BenDundee

@BenDundee: ใช่แล้ว
lowtech

คำตอบ:


139

ดูเหมือนโดยทั่วไปแล้วคุณกำลังมองหาการเข้าร่วม:

> dat1 = pd.DataFrame({'dat1': [9,5]})
> dat2 = pd.DataFrame({'dat2': [7,6]})
> dat1.join(dat2)
   dat1  dat2
0     9     7
1     5     6

46
หรือpd.concat([dat1, dat2], axis=1)ในกรณีนี้.
DSM

2
@BenDundee Join and concat ใช้รหัสเดียวกันจำนวนมากภายใต้ประทุนดังนั้นวิธีที่ "ถูกต้อง" อาจมีความสำคัญเฉพาะเมื่อคุณพิจารณากรณีขอบเท่านั้น ตัวอย่างเช่นที่นี่หาก DataFrames ทั้งสองมีคอลัมน์ 'data' การรวมจะล้มเหลวในขณะที่ concat จะให้คอลัมน์สองคอลัมน์ชื่อ 'data'
U2EF1

@ U2EF1: ฉันกำลังพูดถึงคำตอบของคุณกับของฉัน มี N วิธีในการสกินแมวเสมอ :)
BenDundee

@BenDundee ฉันเห็น วิธีการดังกล่าวจะทิ้งดัชนีที่ไม่ซ้ำกันและมีผลข้างเคียงที่แปลกกว่าในกรณีที่ซับซ้อนมากขึ้น ตัวอย่างเช่นถ้าฉันมีสองคอลัมน์ชื่อ 'data' การจัดกลุ่ม / การรวมจะเริ่มรวมคอลัมน์ข้อมูลที่แตกต่างกันซึ่งแทบจะไม่ใช่สิ่งที่คุณต้องการ ข้อมูลสตริงจะเชื่อมต่อกัน
U2EF1

1
ตามที่ @ jeremy-z ชี้ไว้เป็นสิ่งสำคัญมากในการรีเซ็ตดัชนีในทั้งสองชุดข้อมูลหากไม่ได้ใช้ดัชนีเดียวกัน มิฉะนั้นคุณจะได้รับชุดข้อมูลหนึ่งชุดที่มีแถว NaN จำนวนมาก
Israel Varea


41

ทั้งสองjoin()และconcat()วิธีที่จะแก้ปัญหา อย่างไรก็ตามมีคำเตือนอย่างหนึ่งที่ฉันต้องพูดถึง: รีเซ็ตดัชนีก่อนคุณjoin()หรือconcat()หากคุณพยายามจัดการกับกรอบข้อมูลบางส่วนโดยเลือกแถวบางแถวจาก DataFrame อื่น

ตัวอย่างด้านล่างแสดงพฤติกรรมที่น่าสนใจของการเข้าร่วมและการเชื่อมต่อ:

dat1 = pd.DataFrame({'dat1': range(4)})
dat2 = pd.DataFrame({'dat2': range(4,8)})
dat1.index = [1,3,5,7]
dat2.index = [2,4,6,8]

# way1 join 2 DataFrames
print(dat1.join(dat2))
# output
   dat1  dat2
1     0   NaN
3     1   NaN
5     2   NaN
7     3   NaN

# way2 concat 2 DataFrames
print(pd.concat([dat1,dat2],axis=1))
#output
   dat1  dat2
1   0.0   NaN
2   NaN   4.0
3   1.0   NaN
4   NaN   5.0
5   2.0   NaN
6   NaN   6.0
7   3.0   NaN
8   NaN   7.0

#reset index 
dat1 = dat1.reset_index(drop=True)
dat2 = dat2.reset_index(drop=True)
#both 2 ways to get the same result

print(dat1.join(dat2))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7


print(pd.concat([dat1,dat2],axis=1))
   dat1  dat2
0     0     4
1     1     5
2     2     6
3     3     7

พูดได้ดีและเป็นจุดที่ดี ฉันพยายามโดยไม่รีเซ็ตดัชนีและสร้าง NULLS จำนวนมาก
อานันท์

โดยไม่ต้องทำขั้นตอนรีเซ็ตข้อมูลของฉันก็ดูดีและดี แต่เห็นได้ชัดว่ามีบางอย่างทำงานไม่ดีในเบื้องหลัง ขอบคุณที่ชี้ให้ดู! การรีเซ็ตทำให้โมเดลของฉันทำงานได้!
Ionuț Ciuta

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! มันจะสร้าง NaN เสมอถ้าเราไม่รีเซ็ตดัชนี
Srivatsan

ขั้นตอนนี้ช่วยฉันได้ ฉันพยายามทำความเข้าใจว่าเหตุใดทั้ง concat และ join จึงขว้าง NaN จำนวนมาก ขอบคุณสำหรับการแบ่งปันสิ่งนี้
Gustavo Rottgering


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