2016-05-10 33 views
5

Tôi đang sử dụng Pandas để lưu trữ tập dữ liệu lớn có tên cột được tạo một cách hệ thống. Một cái gì đó như thế này:Sử dụng Pandas DataFrame với nhiều cột tên

import numpy as np 
import pandas as pd 
df = pd.DataFrame([[0,1,2],[10,11,12],[20,21,22]],columns=["r0","r1","r2"]) 

Tên có hệ thống này cũng có tên có ý nghĩa hơn mà người dùng thực sự hiểu. Cho đến nay, tôi đã được lập bản đồ chúng bằng một từ điển như vậy:

altName = {"Objective 1":"r0", "Result 5":"r1", "Parameter 2":"r2"} 

để họ sau đó có thể được truy cập như thế này:

print(df[altName["Objective 1"]]) 

này hoạt động, nhưng nó dẫn đến rất khó đọc mã (suy nghĩ một lệnh cốt truyện với nhiều biến, vv). Tôi không thể đơn giản đổi tên các cột thành các tên thân thiện vì có những lúc tôi cần truy cập cả hai, nhưng tôi không chắc chắn làm thế nào để hỗ trợ cả hai cùng một lúc mà không cần từ điển.

Có thể gán nhiều hơn một tên cho một cột, hoặc làm một số loại bản đồ ngầm rằng sẽ cho phép tôi sử dụng cả hai phương pháp truy cập:

print(df["r0"]) 
print(df["Objective 1]) 

Tôi đã nghĩ đến việc làm của riêng tôi phân lớp đó sẽ phát hiện một keyerror và sau đó không một từ điển thứ cấp của tên thay thế và thử điều đó, nhưng tôi đã không chắc chắn tôi có thể làm điều đó trong khi vẫn giữ tất cả các chức năng DataFrame khác (tôi tự đánh giá người mới bắt đầu Python của tôi giáp với trung gian).

Cảm ơn rất nhiều vì đề xuất của bạn.

Trả lời

5

Có thể. Dataframes chỉ là wrappers trên mảng NumPy, vì vậy bạn có thể nhân wrappers:

Một ví dụ:

df=pd.DataFrame([ [0,1], [2,3] ],list('AB'), columns=list('CD')) 
df2=pd.DataFrame(df.values,df.index, columns=list('EF')) 
df.loc['A','C']=999 

Sau đó, df2 cũng bị ảnh hưởng:

In [407]: df2['E'] 
Out[407]: 
A 999 
B  2 
Name: E, dtype: int32 
+0

Như tôi đã xây dựng câu trả lời của tôi trong đầu tôi khi tôi đang đọc, tôi đã nghĩ ra điều này. Đây là con đường để đi. – piRSquared

+0

Thú vị, không nghĩ về điều đó. Nếu tôi hiểu chính xác, df2 sẽ chỉ có tên cột mới, vì vậy tôi có thể sử dụng df cho tên gốc và df2 cho tên mới, nhưng không phải cho cả hai? Có cách nào tôi có thể có một hỗ trợ cả hai tên? – Andrew

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