2017-02-07 14 views
6

HỎIluận Pandas DataFrame.assign

Làm thế nào có thể assign được sử dụng để trả về một bản sao của DataFrame ban đầu với nhiều cột mới được bổ sung?

MONG MUỐN KẾT QUẢ

df = pd.DataFrame({'A': range(1, 5), 'B': range(11, 15)}) 
>>> df.assign({'C': df.A.apply(lambda x: x ** 2), 'D': df.B * 2}) 
    A B C D 
0 1 11 1 22 
1 2 12 4 24 
2 3 13 9 26 
3 4 14 16 28 

ATTEMPTS

Ví dụ trên kết quả trong:

ValueError: Wrong number of items passed 2, placement implies 1.

BỐI CẢNH

Các assign chức năng trong Pandas có một bản sao của dataframe có liên quan tham gia vào cột mới được giao, ví dụ

df = df.assign(C=df.B * 2) 
>>> df 
    A B C 
0 1 11 22 
1 2 12 24 
2 3 13 26 
3 4 14 28 

0.19.2 documentation cho hàm này ngụ ý rằng nhiều hơn một cột có thể được thêm vào khung dữ liệu.

Chỉ định nhiều cột trong cùng một chỉ định là có thể, nhưng bạn không thể tham chiếu các cột khác được tạo trong cùng một cuộc gọi gán.

Ngoài ra:

Tham số:
kwargs: từ khóa, cặp giá trị

từ khóa là tên cột.

Các mã nguồn cho các chức năng khẳng định rằng nó chấp nhận một từ điển:

def assign(self, **kwargs): 
    """ 
    .. versionadded:: 0.16.0 
    Parameters 
    ---------- 
    kwargs : keyword, value pairs 
     keywords are the column names. If the values are callable, they are computed 
     on the DataFrame and assigned to the new columns. If the values are not callable, 
     (e.g. a Series, scalar, or array), they are simply assigned. 

    Notes 
    ----- 
    Since ``kwargs`` is a dictionary, the order of your 
    arguments may not be preserved. The make things predicatable, 
    the columns are inserted in alphabetical order, at the end of 
    your DataFrame. Assigning multiple columns within the same 
    ``assign`` is possible, but you cannot reference other columns 
    created within the same ``assign`` call. 
    """ 

    data = self.copy() 

    # do all calculations first... 
    results = {} 
    for k, v in kwargs.items(): 

     if callable(v): 
      results[k] = v(data) 
     else: 
      results[k] = v 

    # ... and then assign 
    for k, v in sorted(results.items()): 
     data[k] = v 

    return data 
+3

Tôi nghĩ rằng các tài liệu cần được rõ ràng hơn về cách làm cho công việc này với nhiều cột để tránh sự nhập nhằng với một ví dụ được cung cấp – EdChum

Trả lời

8

Bạn có thể tạo nhiều cột bằng cách cung cấp mỗi cột mới như một đối số từ khóa:

df = df.assign(C=df['A']**2, D=df.B*2) 

tôi từ điển mẫu của bạn hoạt động bằng cách giải nén từ điển làm đối số từ khóa bằng cách sử dụng **:

df = df.assign(**{'C': df.A.apply(lambda x: x ** 2), 'D': df.B * 2}) 

Có vẻ như assign sẽ có thể lấy từ điển, nhưng nó không được hỗ trợ hiện tại dựa trên mã nguồn bạn đã đăng.

Các kết quả đầu ra:

A B C D 
0 1 11 1 22 
1 2 12 4 24 
2 3 13 9 26 
3 4 14 16 28