2013-05-24 73 views
121

tôi đã xây dựng một điều kiện là trích xuất chính xác một hàng từ khung dữ liệu của tôi:Cách lấy giá trị từ ô của một khung dữ liệu?

d2 = df[(df['l_ext']==l_ext) & (df['item']==item) & (df['wn']==wn) & (df['wd']==1)] 

Bây giờ tôi muốn để có một giá trị từ một cột cụ thể:

val = d2['col_name'] 

Nhưng kết quả là tôi nhận được khung dữ liệu chứa một hàng và một cột (tức là một ô). Nó không phải là những gì tôi cần. Tôi cần một giá trị (một số phao). Làm thế nào tôi có thể làm điều đó trong gấu trúc?

Trả lời

144

Nếu bạn có một DataFrame chỉ với một hàng, sau đó truy cập đầu tiên (chỉ) liên tiếp như một Series sử dụng iloc, và sau đó là giá trị sử dụng tên cột:

In [3]: sub_df 
Out[3]: 
      A   B 
2 -0.133653 -0.030854 

In [4]: sub_df.iloc[0] 
Out[4]: 
A -0.133653 
B -0.030854 
Name: 2, dtype: float64 

In [5]: sub_df.iloc[0]['A'] 
Out[5]: -0.13365288513107493 
+22

Cảm ơn bạn! cho câu trả lời - không ai khác tìm thấy một thực tế rằng đây là giải pháp chỉ ngoài vô lý? – Sophologist

+0

@Sophologist nhìn vào điều này, tôi không có ý tưởng. Câu hỏi này có một chút được nói một cách kỳ lạ, nhưng nó giống như nửa đầu là không quan trọng đối với cái sau. ('at' là một câu trả lời thực sự tốt đẹp, mặc dù tôi tìm thấy nó kỳ lạ nó giống như' ix' :)) –

+1

@Sophologist Tôi đồng ý rằng vô lý của nó rằng điều này là cần thiết. Nó cũng không hoạt động khi bạn cố gắng chuyển các điều kiện nội tuyến; 'my_df.loc [my_df ['Col1'] == foo] ['Col2']' vẫn trả về một đối tượng kiểu '' – user5359531

74

Đây là cho vô hướng truy cập nhanh

In [15]: df = pandas.DataFrame(numpy.random.randn(5,3),columns=list('ABC')) 

In [16]: df 
Out[16]: 
      A   B   C 
0 -0.074172 -0.090626 0.038272 
1 -0.128545 0.762088 -0.714816 
2 0.201498 -0.734963 0.558397 
3 1.563307 -1.186415 0.848246 
4 0.205171 0.962514 0.037709 

In [17]: df.iat[0,0] 
Out[17]: -0.074171888537611502 

In [18]: df.at[0,'A'] 
Out[18]: -0.074171888537611502 
+0

Tôi thích câu trả lời này rất nhiều. Nhưng trong khi bạn có thể làm '.iloc [-1] ['A']' bạn không thể làm 'tại [-1, 'A']' để có được mục nhập cuối cùng – hartmut

6

Dường như thay đổi sau khi gấu trúc 10,1/13,1

tôi nâng cấp 10,1-13,1, trước khi iloc không có sẵn.

Bây giờ với 13.1, iloc[0]['label'] nhận một mảng giá trị đơn chứ không phải là vô hướng.

Như thế này:

lastprice=stock.iloc[-1]['Close'] 

Output:

date 
2014-02-26 118.2 
name:Close, dtype: float64 
+0

Tôi nghĩ rằng điều này chỉ nên là trường hợp của Series với các mục trùng lặp ... trên thực tế, tôi không thấy điều này, bạn có thể đưa ra một ví dụ nhỏ để chứng minh điều này không? –

+0

i đã sử dụng gấu trúc 13.x, cả hai iloc [] [] hoặc iloc [,] tạo ra một vô hướng. chỉ iloc không làm việc với chỉ số tiêu cực, như -1 – timeislove

+0

Nếu bạn có thể đưa ra một ví dụ đồ chơi chứng minh điều này trong câu trả lời nó sẽ thực sự hữu ích! –

1

Đối với gấu trúc 0.10, nơi iloc là unavalable, lọc một DF và lấy dữ liệu hàng đầu tiên cho cột VALUE:

df_filt = df[df['C1'] == C1val & df['C2'] == C2val] 
result = df_filt.get_value(df_filt.index[0],'VALUE') 

nếu có nhiều hơn thì 1 hàng được lọc, obt ain giá trị hàng đầu tiên. Sẽ có một ngoại lệ nếu kết quả bộ lọc trong khung dữ liệu trống.

+1

'get_value' không còn được dùng nữa (v0.21.0 RC1 (ngày 13 tháng 10 năm 2017)) [tham chiếu ở đây] (https://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#deprecations)' .get_value và .set_value trên Series, DataFrame, Panel, SparseSeries và SparseDataFrame không còn được sử dụng để sử dụng các trình truy cập .iat [] hoặc .at [] (GH15269) ' –

2

Không chắc chắn đây có phải là phương pháp hay hay không, nhưng tôi nhận thấy rằng tôi cũng chỉ có thể nhận được giá trị bằng cách truyền chuỗi dưới dạng float.

ví dụ:

rate 

3 0,042679

Tên: Unemployment_rate, dtype: float64

float(rate) 

0,0426789

2

Các nhanh nhất/tùy chọn dễ dàng nhất tôi ha đã tìm thấy những điều sau đây. 501 đại diện cho chỉ mục hàng.

df.at[501,'column_name'] 
df.get_value(501,'column_name') 
+1

' get_value' không được dùng nữa (v0.21.0 RC1 (tháng 10) 13, 2017)) [tham chiếu ở đây] (https://pandas-docs.github.io/pandas-docs-travis/whatsnew.html#deprecations) '.get_value và .set_value trên Series, DataFrame, Panel, SparseSeries, và SparseDataFrame không còn được dùng để sử dụng các trình truy cập .iat [] hoặc .at [] (GH15269) ' –

4

Hầu hết các câu trả lời đều sử dụng iloc phù hợp để chọn theo vị trí.

Nếu bạn cần selection-by-labelloc sẽ thuận tiện hơn.

Để nhận được một giá trị rõ ràng (equiv để phản đối df.get_value ('a', 'A'))

# this is also equivalent to df1.at['a','A'] 
In [55]: df1.loc['a', 'A'] 
Out[55]: 0.13200317033032932 
Các vấn đề liên quan