2015-01-27 44 views
14

Tôi có 2 khung dữ liệu, một trong số đó có thông tin bổ sung cho một số (nhưng không phải tất cả) của các hàng trong cột kia.gấu trúc hợp nhất khung dữ liệu điền vào các giá trị bị thiếu

names = df({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'], 
      'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']}) 
info = df({'names':['joe','mark','tim','frank'], 
      'classification':['thief','thief','good','thief']}) 

Tôi muốn để có những cột phân loại từ info dataframe ở trên và thêm nó vào names dataframe trên. Tuy nhiên, khi tôi làm combined = pd.merge(names, info), khung dữ liệu kết quả chỉ dài 4 hàng. Tất cả các hàng không có thông tin bổ sung đều bị loại bỏ.

Lý tưởng nhất, tôi sẽ có các giá trị trong các cột bị thiếu được đặt thành không xác định. Kết quả trong một khung dữ liệu nơi một số người là các chủ đề, một số là tốt, và phần còn lại là không rõ.

EDIT: Một trong những câu trả lời đầu tiên tôi nhận được đề xuất bằng cách sử dụng tính năng kết hợp hợp nhất dường như làm một số điều kỳ lạ. Đây là mẫu mã:

names = df({'names':['bob','frank','bob','bob','bob''james','tim','ricardo','mike','mark','joan','joe'], 
      'position':['dev','dev','dev','dev','dev','dev''sys','sys','sys','sup','sup','sup']}) 
info = df({'names':['joe','mark','tim','frank','joe','bill'], 
      'classification':['thief','thief','good','thief','good','thief']}) 
what = pd.merge(names, info, how="outer") 
what.fillna("unknown") 

Điều kỳ lạ là ở đầu ra, tôi sẽ có hàng có tên kết quả là "bobjames" và một vị trí khác là "devsys". Cuối cùng, mặc dù hóa đơn không xuất hiện trong dataframe tên mà nó hiển thị trong khung dữ liệu kết quả. Vì vậy, tôi thực sự cần một cách để nói tra cứu một giá trị trong dataframe khác này và nếu bạn tìm thấy một cái gì đó tack trên những cột.

+0

bạn có muốn 'kết hợp = pd.merge (tên, thông tin, làm thế nào = 'bên ngoài') '? – EdChum

+2

Bạn phải gán kết quả của 'fillna' hoặc pass param' inplace = True' để 'what = what.fillna ('unknown')' hoặc 'what.fillna ('unknown', inplace = True)' – EdChum

+1

'bobjames 'và' devsys 'là do thiếu dấu phẩy trong dữ liệu đầu vào của bạn (có thể là lỗi đánh máy). 'hóa đơn' xuất hiện vì bạn đang sử dụng kết hợp bên ngoài. Sử dụng how = 'left' nếu bạn chỉ muốn các giá trị từ các tên có các giá trị tùy chọn từ thông tin. –

Trả lời

11

Tôi nghĩ rằng bạn muốn thực hiện một outermerge:

In [60]: 

pd.merge(names, info, how='outer') 
Out[60]: 
    names position classification 
0  bob  dev   NaN 
1 frank  dev   thief 
2 james  dev   NaN 
3  tim  sys   good 
4 ricardo  sys   NaN 
5  mike  sys   NaN 
6  mark  sup   thief 
7  joan  sup   NaN 
8  joe  sup   thief 

Có phần thể hiện kiểu hòa trộn có thể thực hiện: http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

+0

Cảm ơn vì điều đó, nhưng tôi vẫn gặp một số rắc rối khi nhận được những gì tôi muốn. Tôi đã cập nhật câu hỏi của mình với nhiều ngữ cảnh hơn. –

10

Trong trường hợp bạn vẫn đang tìm kiếm một câu trả lời cho điều này:

Những điều "lạ" mà bạn mô tả là do một số lỗi nhỏ trong mã của bạn. Ví dụ, lần đầu tiên (sự xuất hiện của "bobjames" và "devsys") là do bạn không có dấu phẩy giữa hai giá trị đó trong các khung dữ liệu nguồn của bạn. Và thứ hai là bởi vì gấu trúc không quan tâm đến tên của khung dữ liệu của bạn nhưng quan tâm đến tên của các cột của bạn khi hợp nhất (bạn có một khung dữ liệu được gọi là "tên" mà còn các cột của bạn được gọi là "tên"). Nếu không, có vẻ như việc hợp nhất được thực hiện chính xác những gì bạn đang tìm kiếm:

import pandas as pd 
names = pd.DataFrame({'names':['bob','frank','bob','bob','bob', 'james','tim','ricardo','mike','mark','joan','joe'], 
         'position':['dev','dev','dev','dev','dev','dev', 'sys','sys','sys','sup','sup','sup']}) 

info = pd.DataFrame({'names':['joe','mark','tim','frank','joe','bill'], 
        'classification':['thief','thief','good','thief','good','thief']}) 
what = pd.merge(names, info, how="outer") 
what.fillna('unknown', inplace=True) 

mà sẽ cho kết quả:

 names position classification 
0  bob  dev  unknown 
1  bob  dev  unknown 
2  bob  dev  unknown 
3  bob  dev  unknown 
4  frank  dev   thief 
5  james  dev  unknown 
6  tim  sys   good 
7 ricardo  sys  unknown 
8  mike  sys  unknown 
9  mark  sup   thief 
10  joan  sup  unknown 
11  joe  sup   thief 
12  joe  sup   good 
13  bill unknown   thief 
0

nghĩ về nó như một SQL tham gia hoạt động. Bạn cần tham gia left-outer [1].

names = pd.DataFrame({'names':['bob','frank','james','tim','ricardo','mike','mark','joan','joe'],'position':['dev','dev','dev','sys','sys','sys','sup','sup','sup']})

info = pd.DataFrame({'names':['joe','mark','tim','frank'],'classification':['thief','thief','good','thief']})

Vì có names mà không có classification, một left-outer tham gia sẽ thực hiện công việc.

a = pd.merge(names, info, how='left', on='names')

Kết quả là ...

>>> a 
    names position classification 
0  bob  dev   NaN 
1 frank  dev   thief 
2 james  dev   NaN 
3  tim  sys   good 
4 ricardo  sys   NaN 
5  mike  sys   NaN 
6  mark  sup   thief 
7  joan  sup   NaN 
8  joe  sup   thief 

... mà là tốt. Tất cả các kết quả NaN là ok nếu bạn nhìn vào cả hai bảng.

Chúc mừng!

[1] - http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging

Các vấn đề liên quan