Làm thế nào để có được một giá trị từ một ô của khung dữ liệu?


344

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

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

Bây giờ tôi muốn lấy 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 một 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ố float). Làm thế nào tôi có thể làm điều đó trong gấu trúc?


1
Nếu bạn đã thử một số câu trả lời nhưng kết thúc bằng a SettingWithCopyWarning, bạn có thể xem bài đăng này để được giải thích về cảnh báo và các giải pháp / giải pháp có thể.
cs95

Câu trả lời:


428

Nếu bạn có DataFrame chỉ có một hàng, thì hãy truy cập vào hàng đầu tiên (chỉ) dưới dạng Sê-ri bằng cách sử dụng ilocvà 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

1
@Sophologist nhìn này, tôi không có ý kiến. Câu hỏi có một từ hơi lạ, nhưng nó đọc như nửa đầu là không quan trọng đối với sau này. ( atlà một câu trả lời thực sự hay, mặc dù tôi thấy nó lạ như vậy ix:))
Andy Hayden

9
@Sophologist Tôi đồng ý rằng thật nực cười khi điều này là bắt buộc. Nó cũng không hoạt động khi bạn cố gắng vượt qua nội tuyến có điều kiện; my_df.loc[my_df['Col1'] == foo]['Col2']vẫn trả về một đối tượng thuộc loại<class 'pandas.core.series.Series'>
user5359531

15
Lưu ý rằng giải pháp này trả về Sê-ri, không phải giá trị!
Atte Juvonen

1
@AtteJuvonen Điều đó phụ thuộc vào việc bạn có trùng lặp trong chỉ mục / cột của mình không (lưu ý tại / iat làm tăng ngoại lệ với các cột trùng lặp, sẽ gây ra sự cố).
Andy Hayden

1
kỳ dị. Tôi tiếp tục đọc loc là cho tên và iloc là cho số nguyên nhưng ở đây tôi là iloc cho cả số nguyên và tên
mLstudent33

205

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

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

9
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 gì at[-1,'A']để có được hàng cuối cùng
hartmut

3
đây sẽ là câu trả lời vì chúng ta không sao chép trong bộ nhớ một dòng vô dụng để chỉ có một phần tử bên trong.
bormat

3
@hartmut Bạn luôn có thể làmat[df.index[-1],'A']
cs95

105

Bạn có thể biến khung dữ liệu 1x1 của mình thành một mảng gọn gàng, sau đó truy cập giá trị đầu tiên và duy nhất của mảng đó:

val = d2['col_name'].values[0]

10
Vui lòng cải thiện chất lượng câu trả lời của bạn với một chút giải thích.
Franck Gamess

Chỉnh sửa câu trả lời ban đầu của bạn với điều này trước khi tạo một bình luận. Cảm ơn
Franck Gamess

2
Tôi thích phương pháp này và sử dụng nó thường xuyên. Được sử dụng để sử dụng .get_values()[0]là tốt.
aaronpenne

3
Tôi nghĩ rằng đây là câu trả lời tốt nhất vì nó không trả về pandas.series và nó đơn giản nhất.
Sean McCarthy

Điều này có lợi thế gì so với các phương pháp được cung cấp bởi Pandas?
AMC

28

Hầu hết các câu trả lời đang sử dụng iloclà tốt cho lựa chọn theo vị trí.

Nếu bạn cần lựa chọn theo nhãn loc sẽ thuận tiện hơn.

Để nhận được một giá trị rõ ràng (tương đương vớ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

18

Tôi cần giá trị của một ô, được chọn theo tên cột và chỉ mục. Giải pháp này hiệu quả với tôi:

original_conversion_frequency.loc[1,:].values[0]


16

Có vẻ như những thay đổi sau gấu trúc 10.1 / 13.1

Tôi đã nâng cấp từ 10.1 lên 13.1, trước khi iloc không có sẵn.

Bây giờ với 13.1, iloc[0]['label']có được một mảng giá trị duy nhất thay vì vô hướng.

Như thế này:

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

Đầu ra:

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

Tôi nghĩ đây chỉ là trường hợp của Series có các mục trùng lặp ... 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?
Andy Hayden

tôi đã sử dụng gấu trúc 13.x, cả iloc [] [] hoặc iloc [,] đều tạo ra vô hướng. chỉ iloc không hoạt động với chỉ số âm, như -1
timeislove

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

5

Các tùy chọn nhanh nhất / dễ nhất mà tôi đã tìm thấy là như sau. 501 đại diện cho chỉ số hàng.

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

5
get_valuehiện không được chấp nhận (v0.21.0 RC1 (ngày 13 tháng 10 năm 2017)) tại đây .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

4

Đối với gấu trúc 0.10, nơi không thể thực ilochiện được, hãy lọc a DFvà 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 1 hàng được lọc, hãy lấy giá trị hàng đầu tiên. Sẽ có một ngoại lệ nếu bộ lọc dẫn đến khung dữ liệu trống.


3
get_valuehiện không được chấp nhận (v0.21.0 RC1 (ngày 13 tháng 10 năm 2017)) tại đây .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are deprecated in favor of using .iat[] or .at[] accessors (GH15269)
Shihe Zhang

Nhưng iathoặc atkhông thể có được giá trị dựa trên tên cột.
sivabudh

4

Không chắc đây có phải là một thực hành tốt hay không, nhưng tôi nhận thấy tôi cũng có thể nhận được giá trị bằng cách chọn chuỗi như float.

ví dụ

rate

3 0,042679

Tên: Thất nghiệp_rate, dtype: float64

float(rate)

0,0426789


Điều đó có làm việc với một loạt đa yếu tố không?
Praxiteles


-1
df_gdp.columns

Chỉ mục ([u'Country ', u'Country Code', u'Theicator Name ', u'Theicator Code', u'1960 ', u'1961', u'1962 ', u'1963', u'1964 ' , u'1965 ', u'1966', u'1967 ', u'1968', u'1969 ', u'1970', u'1971 ', u'1972', u'1973 ', u'1974' , u'1975 ', u'1976', u'1977 ', u'1978', u'1979 ', u'1980', u'1981 ', u'1982', u'1983 ', u'1984' , u'1985 ', u'1986', u'1987 ', u'1988', u'1989 ', u'1990', u'1991 ', u'1992', u'1993 ', u'1994' , u'1995 ', u'1996', u'1997 ', u'1998', u'1999 ', u'2000',u'2001 ', u'2002', u'2003 ', u'2004', u'2005 ', u'2006', u'2007 ', u'2008', u'2009 ', u'2010', u'2011 ', u'2012', u'2013 ', u'2014', u'2015 ', u'2016'], dtype = 'object')

df_gdp[df_gdp["Country Code"] == "USA"]["1996"].values[0]

8100000000000.0


4
Đây là một câu trả lời hay một câu hỏi?
Vega

4
Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn về đoạn mã, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách mô tả lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
sepehr

Mặc dù có số phiếu tiêu cực, câu trả lời này thực sự đã giúp tôi.
CONvid19
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.