Gấu trúc Python chỉ hợp nhất một số cột nhất định


109

Có thể chỉ hợp nhất một số cột không? Tôi có DataFrame df1 với các cột x, y, z và df2 với các cột x, a, b, c, d, e, f, v.v.

Tôi muốn hợp nhất hai DataFrame trên x, nhưng tôi chỉ muốn hợp nhất các cột df2.a, df2.b - không phải toàn bộ DataFrame.

Kết quả sẽ là một DataFrame với x, y, z, a, b.

Tôi có thể hợp nhất sau đó xóa các cột không mong muốn, nhưng có vẻ như có một phương pháp tốt hơn.


1
Andy: Thật dễ dàng ... Tôi cần nghỉ ngơi, rõ ràng là tôi đang làm việc này quá phức tạp. Cảm ơn vì sự rõ ràng!
BubbleGuppies,

Câu trả lời:


81

Bạn có thể hợp nhất DataFrame con (chỉ với các cột đó):

df2[list('xab')]  # df2 but only with columns x, a, and b

df1.merge(df2[list('xab')])

6
Hmmm, tôi tự hỏi nếu có phải là một cách tự nhiên để làm được điều này, giống như tập hợp con trong dropna ... sẽ cùng nhau đưa github vấn đề
Andy Hayden

Hmmm ... Tôi đã thử sử dụng cái này để hợp nhất cột 'Unique_External_Users' từ df2 thành df1 nhưng gặp lỗi ... "Không có [Index (['U', 'n', 'i', 'q', 'u ',' e ',' ',' E ',' x ',' t ',' e ',' r ',' n ',' a ', \ n' l ',' ',' U ', 's', 'e', ​​'r', 's'], \ n dtype = 'object')] nằm trong [cột] ".
CoolDocMan

Đây là mã. ... df1.merge (df2 ('Unique_External_Users')])
CoolDocMan

1
@CoolDocMan Tôi nghĩ bạn đã bỏ lỡ điều gì đó từ câu trả lời được đề xuất: list('xab')lấy mỗi phần tử (chữ cái) của chuỗi 'xab' và chuyển đổi nó thành một phần tử danh sách để list('xab')trả về ['x', 'a', 'b']. Điều đó hoạt động nếu mỗi cột có một chữ cái duy nhất làm tên. Trong trường hợp của bạn, tôi nghĩ bạn cần thực hiện df1.merge (df2 ['Unique_External_Users'], * other_arguments). ... Hiện tại có lẽ bạn đã giải quyết được nó rồi, chỉ cần để điều này cho những người mới xung quanh, như tôi
SOf_PUAR

114

Bạn muốn sử dụng HAI dấu ngoặc, vì vậy nếu bạn đang thực hiện loại hành động VLOOKUP:

df = pd.merge(df,df2[['Key_Column','Target_Column']],on='Key_Column', how='left')

Điều này sẽ cung cấp cho bạn mọi thứ trong df ban đầu + thêm một cột tương ứng trong df2 mà bạn muốn tham gia.


11

Nếu bạn muốn loại bỏ (các) cột khỏi khung dữ liệu đích, nhưng (các) cột là bắt buộc cho phép nối, bạn có thể làm như sau:

df1 = df1.merge(df2[['a', 'b', 'key1']], how = 'left',
                left_on = 'key2', right_on = 'key1').drop('key1')

Phần .drop('key1')này sẽ ngăn 'key1' được giữ trong khung dữ liệu kết quả, mặc dù nó được yêu cầu tham gia ngay từ đầu.


4
Tôi nhận được lỗi sau nếu tôi cố gắng này:KeyError: "['key1'] not found in axis"
Tanya Branagan

3
thử .drop (cột = ['key1'])
psangam

Hoặc .drop ('key1', axis = 1)
tonneofash

8

Bạn có thể sử dụng .locđể chọn các cột cụ thể với tất cả các hàng và sau đó kéo hàng đó. Dưới đây là một ví dụ:

pandas.merge(dataframe1, dataframe2.iloc[:, [0:5]], how='left', on='key')

Trong ví dụ này, bạn đang hợp nhất dataframe1 và dataframe2. Bạn đã chọn thực hiện một phép nối ngoài cùng bên trái trên 'key'. Tuy nhiên, đối với dataframe2 mà bạn đã chỉ định .iloccho phép bạn xác định các hàng và cột bạn muốn ở định dạng số. Sử dụng :, bạn chọn tất cả các hàng, nhưng [0:5]chọn 5 cột đầu tiên. Bạn có thể sử dụng .locđể chỉ định theo tên, nhưng nếu bạn xử lý các tên cột dài, thì .iloccó thể tốt hơn.


1
Hãy coi chừng điều đó .locsẽ tạo ra một bản sao và trên một df lớn có thể gây đau đớn. Tốt hơn là nên hợp nhất sau đó lấy ngay một lát cột trong cùng một biểu thức.
smci

7

Điều này là để hợp nhất các cột đã chọn từ hai bảng.

Nếu table_1chứa t1_a,t1_b,t1_c..,id,..t1_zcột và table_2chứa t2_a, t2_b, t2_c..., id,..t2_zcột và chỉ t1_a, id, t2_a là bắt buộc trong bảng cuối cùng, thì

mergedCSV = table_1[['t1_a','id']].merge(table_2[['t2_a','id']], on = 'id',how = 'left')
# save resulting output file    
mergedCSV.to_csv('output.csv',index = False)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.