2014-09-26 20 views
5

Tôi có khung dữ liệu sau:Python Pandas: chọn phần tử trong cột mảng

pa=pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])}) 

Tôi muốn chọn cột 'a' và sau đó chỉ là một yếu tố đặc biệt (ví dụ đầu tiên: 1., 2., 3.)

gì tôi cần phải thêm vào:

pa.loc[:,['a']] 

?

Trả lời

9

pa.loc[row] chọn hàng có nhãn row.

pa.loc[row, col] chọn các tế bào đó là những instersection của rowcol

pa.loc[:, col] chọn tất cả hàng và cột có tên col. Lưu ý rằng mặc dù điều này làm việc nó không phải là cách thành ngữ để tham chiếu đến một cột của một khung dữ liệu. Đối với điều đó, bạn nên sử dụng pa['a']

Bây giờ bạn có danh sách trong các ô của cột để bạn có thể sử dụng vectorized string methods để truy cập vào các thành phần của các danh sách như vậy.

pa['a'].str[0] #first value in lists 
pa['a'].str[-1] #last value in lists 
+0

cảm ơn. giải pháp tốt đẹp – jankos

4

Lưu trữ hàng của một mảng NumPy trong một cột của bảng Pandas có xu hướng là một sai lầm vì làm bất kỳ điều gì hữu ích với dữ liệu trong biểu mẫu này thật khó xử.

Dưới đây là hai cách để có được các dữ liệu mong muốn, không ai trong số đó là rất đẹp:

import numpy as np 
import pandas as pd 
import operator 

pa = pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])}) 
print(pa['a'].map(operator.itemgetter(0))) 
# 0 1 
# 1 2 
# 2 3 
# Name: a, dtype: float64 

Hoặc bạn chỉ có thể sử dụng danh sách hiểu:

print([item[0] for item in pa['a']]) 
# [1.0, 2.0, 3.0] 

Đó phương pháp này ngoại hình thứ hai dễ dàng hơn nhiều có thể là dấu hiệu cho thấy danh sách các danh sách có thể là cấu trúc dữ liệu thích hợp hơn ở đây.


Nếu bạn muốn sử dụng một bảng Pandas, nó có thể là tốt hơn để lưu trữ mỗi giá trị trong cột riêng của mình:

0 1 2 
0 1 4 NaN 
1 2 NaN NaN 
2 3 4 5 

này có thể đòi hỏi nhiều bộ nhớ hơn, nhưng dữ liệu hiện đang ở một hình thức có thể hữu ích hơn.

Bạn có thể chuyển đổi DataFrame của bạn vào cái mới này như thế này:

In [314]: pa = pa['a'].apply(lambda row: pd.Series(row)); pa 
Out[314]: 
    0 1 2 
0 1 4 NaN 
1 2 NaN NaN 
2 3 4 5 

Và bây giờ chọn giá trị đầu tiên từ mỗi hàng là dễ dàng:

In [315]: pa[0] 
Out[315]: 
0 1 
1 2 
2 3 
Name: 0, dtype: float64 

Nó cũng nhanh hơn nhiều so với các tùy chọn khác :

In [5]: pa2 = pa['a'].apply(lambda row: pd.Series(row)) 

In [6]: %timeit pa2[0] 
100000 loops, best of 3: 1.95 µs per loop 

In [10]: %timeit [item[0] for item in pa['a']] 
100000 loops, best of 3: 14.4 µs per loop 

In [9]: %timeit pa['a'].map(operator.itemgetter(0)) 
10000 loops, best of 3: 44 µs per loop 

In [13]: %timeit pa['a'].str[0] 
10000 loops, best of 3: 67.2 µs per loop 
+0

đây là một câu trả lời rất tốt. dunno tại sao không ai upvoted được nêu ra! – Aaron

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