Gấu trúc Python: Giữ cột đã chọn dưới dạng DataFrame thay vì Chuỗi


92

Khi chọn một cột duy nhất từ ​​DataFrame của gấu trúc (giả sử df.iloc[:, 0], df['A']hoặc df.A, v.v.), vectơ kết quả được tự động chuyển đổi thành Chuỗi thay vì DataFrame một cột. Tuy nhiên, tôi đang viết một số hàm lấy DataFrame làm đối số đầu vào. Do đó, tôi thích xử lý DataFrame cột đơn thay vì Chuỗi để hàm có thể giả sử rằng df.columns có thể truy cập được. Ngay bây giờ tôi phải chuyển đổi rõ ràng Series thành DataFrame bằng cách sử dụng một cái gì đó như pd.DataFrame(df.iloc[:, 0]). Đây có vẻ không phải là phương pháp sạch sẽ nhất. Có cách nào thanh lịch hơn để lập chỉ mục từ DataFrame trực tiếp để kết quả là DataFrame một cột thay vì Chuỗi không?


6
df.iloc [:, [0]] hoặc df [['A']]; df.A only sẽ trả lại một loạt tuy nhiên
Jeff

Câu trả lời:


99

Như @Jeff đã đề cập có một số cách để thực hiện việc này, nhưng tôi khuyên bạn nên sử dụng loc / iloc để rõ ràng hơn (và nêu ra lỗi sớm nếu bạn đang thử điều gì đó không rõ ràng):

In [10]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])

In [11]: df
Out[11]:
   A  B
0  1  2
1  3  4

In [12]: df[['A']]

In [13]: df[[0]]

In [14]: df.loc[:, ['A']]

In [15]: df.iloc[:, [0]]

Out[12-15]:  # they all return the same thing:
   A
0  1
1  3

Hai lựa chọn sau loại bỏ sự mơ hồ trong trường hợp tên cột số nguyên (chính xác là tại sao loc / iloc được tạo). Ví dụ:

In [16]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 0])

In [17]: df
Out[17]:
   A  0
0  1  2
1  3  4

In [18]: df[[0]]  # ambiguous
Out[18]:
   A
0  1
1  3

2
Xin lỗi đã làm phiền bạn, nhưng chỉ là một câu hỏi thực sự nhanh về vấn đề này. Tôi thấy cách phần bổ sung []làm cho kết quả là a DataFramethay vì a Series, nhưng ở đâu trong tài liệu gấu trúc, loại cú pháp lập chỉ mục này được thảo luận? Tôi chỉ đang cố gắng lấy tên "chính thức" cho kỹ thuật lập chỉ mục này để tôi thực sự hiểu nó. Cám ơn!
sparc_spread

3
@sparc_spread pandas.pydata.org/pandas-docs/stable/indexing.html#basics "Bạn có thể chuyển danh sách các cột đến [] để chọn các cột theo thứ tự đó." Tôi không chắc cái này có tên hay không!
Andy Hayden

Vâng, có vẻ như nó không có - nhưng tôi sẽ tiếp tục sử dụng nó từ bây giờ. Thật ngạc nhiên khi có bao nhiêu thứ được chôn trong cả API và tài liệu. Cám ơn!
sparc_spread

Sự phân biệt này rất hữu ích cho tôi, vì đôi khi tôi muốn có một DataFrame cột duy nhất để tôi có thể sử dụng các phương thức DataFrame trên dữ liệu không có sẵn trên Series. (ISTR, phương pháp âm mưu hoạt động khác nhau). Đó là một điều hiển nhiên đối với tôi khi tôi nhận ra mình có thể sử dụng danh sách một phần tử!
RufusVS

4

Như Andy Hayden đề xuất, sử dụng .iloc / .loc để lập chỉ mục khung dữ liệu (một cột duy nhất) là cách để thực hiện; một điểm cần lưu ý nữa là cách thể hiện các vị trí chỉ số. Sử dụng các nhãn / vị trí chỉ mục được liệt kê trong khi chỉ định các giá trị đối số để lập chỉ mục dưới dạng Khung dữ liệu; nếu không làm như vậy sẽ trả về 'pandas.core.series.Series'

Đầu vào:

    A_1 = train_data.loc[:,'Fraudster']
    print('A_1 is of type', type(A_1))
    A_2 = train_data.loc[:, ['Fraudster']]
    print('A_2 is of type', type(A_2))
    A_3 = train_data.iloc[:,12]
    print('A_3 is of type', type(A_3))
    A_4 = train_data.iloc[:,[12]]
    print('A_4 is of type', type(A_4))

Đầu ra:

    A_1 is of type <class 'pandas.core.series.Series'>
    A_2 is of type <class 'pandas.core.frame.DataFrame'>
    A_3 is of type <class 'pandas.core.series.Series'>
    A_4 is of type <class 'pandas.core.frame.DataFrame'>

1

Bạn có thể sử dụng df.iloc[:, 0:1], trong trường hợp này, vectơ kết quả sẽ là một DataFramechuỗi chứ không phải chuỗi.

Bạn có thể thấy:

nhập mô tả hình ảnh ở đây


1

Ba cách tiếp cận này đã được đề cập:

pd.DataFrame(df.loc[:, 'A'])  # Approach of the original post
df.loc[:,[['A']]              # Approach 2 (note: use iloc for positional indexing)
df[['A']]                     # Approach 3

pd.Series.to_frame () là một cách tiếp cận khác.

Bởi vì nó là một phương pháp, nó có thể được sử dụng trong các tình huống mà cách tiếp cận thứ hai và thứ ba ở trên không áp dụng. Đặc biệt, nó rất hữu ích khi áp dụng một số phương pháp cho một cột trong khung dữ liệu của bạn và bạn muốn chuyển đổi kết quả đầu ra thành khung dữ liệu thay vì một chuỗi. Ví dụ, trong một Máy tính xách tay Jupyter, một loạt bài sẽ không có đầu ra đẹp, nhưng sẽ có khung dữ liệu.

# Basic use case: 
df['A'].to_frame()

# Use case 2 (this will give you pretty output in a Jupyter Notebook): 
df['A'].describe().to_frame()

# Use case 3: 
df['A'].str.strip().to_frame()

# Use case 4: 
def some_function(num): 
    ...

df['A'].apply(some_function).to_frame()
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.