2016-09-29 15 views
18

Gần đây tôi đã phát hiện gấu trúc "assign" method mà tôi thấy rất thanh lịch. Vấn đề của tôi là tên của cột mới được gán làm từ khóa, vì vậy nó không thể có dấu cách hoặc dấu gạch ngang trong đó.gấu trúc được gán với tên cột mới là chuỗi

df = DataFrame({'A': range(1, 11), 'B': np.random.randn(10)}) 
df.assign(ln_A = lambda x: np.log(x.A)) 
     A   B  ln_A 
0 1 0.426905 0.000000 
1 2 -0.780949 0.693147 
2 3 -0.418711 1.098612 
3 4 -0.269708 1.386294 
4 5 -0.274002 1.609438 
5 6 -0.500792 1.791759 
6 7 1.649697 1.945910 
7 8 -1.495604 2.079442 
8 9 0.549296 2.197225 
9 10 -0.758542 2.302585 

nhưng nếu tôi muốn đặt tên cho cột mới "ln (A)" thì sao? Ví dụ:

df.assign(ln(A) = lambda x: np.log(x.A)) 
df.assign("ln(A)" = lambda x: np.log(x.A)) 


File "<ipython-input-7-de0da86dce68>", line 1 
df.assign(ln(A) = lambda x: np.log(x.A)) 
SyntaxError: keyword can't be an expression 

Tôi biết tôi có thể đổi tên cột ngay sau cuộc gọi .assign, nhưng tôi muốn hiểu thêm về phương pháp này và cú pháp của nó.

+0

cũng ngoặc ngay lập tức điều này như là một số loại phương thức gọi đó là một cái tên bất hợp pháp cho một var: https: //docs.python.org/3.2/reference/lexical_analysis.html#identifiers – EdChum

+0

Từ ví dụ trên, tôi vẫn có thể làm df ['log (A)'] = df.sum (axis = 1), nhưng tôi hiểu tại sao Tôi nhận được lỗi ở trên (nó đã được phần nào dự kiến) – FLab

+0

nhưng 'df ['log (A)']' là một 'str' mà các quy tắc tên biến không áp dụng – EdChum

Trả lời

24

Bạn có thể vượt qua các đối số từ khóa để assign như một cuốn từ điển, như vậy:

kwargs = {"ln(A)" : lambda x: np.log(x.A)} 
df.assign(**kwargs) 

    A   B  ln(A) 
0 1 0.500033 0.000000 
1 2 -0.392229 0.693147 
2 3 0.385512 1.098612 
3 4 -0.029816 1.386294 
4 5 -2.386748 1.609438 
5 6 -1.828487 1.791759 
6 7 0.096117 1.945910 
7 8 -2.867469 2.079442 
8 9 -0.731787 2.197225 
9 10 -0.686110 2.302585 
3

assign mong đợi một loạt các đối số từ khóa. Nó sẽ lần lượt gán các cột với tên của các từ khóa. Đó là tiện dụng, nhưng bạn không thể vượt qua một biểu thức như là từ khóa. Này được nêu ra bởi @EdChum trong các ý kiến ​​với điều này link

sử dụng insert thay vì chuyển đổi inplace

df.insert(2, 'ln(A)', np.log(df.A)) 
df 

enter image description here


sử dụng concat nếu bạn không muốn inplace

pd.concat([df, np.log(df.A).rename('log(A)')], axis=1) 

enter image description here

+0

Cảm ơn câu trả lời của bạn. Có sự khác biệt về hành vi khi chèn chỉ hoạt động tại chỗ – FLab

+0

@FLab Tôi đã cập nhật bài đăng – piRSquared

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