Tìm giá trị lớn nhất của một cột và trả về các giá trị hàng tương ứng bằng cách sử dụng Pandas


117

Cấu trúc của dữ liệu;

Sử dụng Python Pandas, tôi đang cố gắng tìm Country&Place với giá trị lớn nhất.

Điều này trả về giá trị lớn nhất:

data.groupby(['Country','Place'])['Value'].max()

Nhưng làm cách nào để lấy tên CountryPlacetên tương ứng ?

Câu trả lời:


170

Giả sử dfcó một chỉ mục duy nhất, điều này sẽ cho hàng có giá trị lớn nhất:

In [34]: df.loc[df['Value'].idxmax()]
Out[34]: 
Country        US
Place      Kansas
Value         894
Name: 7

Lưu ý rằng idxmaxtrả về các nhãn chỉ mục . Vì vậy, nếu DataFrame có các bản sao trong chỉ mục, nhãn có thể không xác định duy nhất hàng, vì vậydf.loc có thể trả về nhiều hơn một hàng.

Do đó, nếu dfkhông có chỉ mục duy nhất, bạn phải tạo chỉ mục duy nhất trước khi thực hiện như trên. Tùy thuộc vào DataFrame, đôi khi bạn có thể sử dụng stackhoặc set_indextạo chỉ mục duy nhất. Hoặc, bạn có thể chỉ cần đặt lại chỉ mục (để các hàng được đánh số lại, bắt đầu từ 0):

df = df.reset_index()

Cảm ơn bạn. Đó chính xác là những gì tôi đang tìm kiếm.
richie

56
df[df['Value']==df['Value'].max()]

Điều này sẽ trả về toàn bộ hàng có giá trị tối đa


Giải thích: - Biểu thức bên trong thực hiện kiểm tra boolean trong suốt độ dài của dataFrame & chỉ mục đó thỏa mãn phía bên phải của biểu thức (.max ()) trả về chỉ mục, đến lượt nó gọi dòng hoàn chỉnh của dataFrame
penta

10

Quốc gia và địa điểm là chỉ mục của chuỗi, nếu bạn không cần chỉ mục, bạn có thể đặt as_index=False:

df.groupby(['country','place'], as_index=False)['value'].max()

Biên tập:

Có vẻ như bạn muốn địa điểm có giá trị tối đa cho mọi quốc gia, mã sau sẽ thực hiện những gì bạn muốn:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))

điều đó sẽ chỉ trả về tên cột và các loại
richie

8

Tôi nghĩ cách dễ nhất để trả về một hàng có giá trị lớn nhất là lấy chỉ mục của nó. argmax()có thể được sử dụng để trả về chỉ mục của hàng có giá trị lớn nhất.

index = df.Value.argmax()

Bây giờ chỉ mục có thể được sử dụng để lấy các tính năng cho hàng cụ thể đó:

df.iloc[df.Value.argmax(), 0:2]

7

Sử dụng indexthuộc tính của DataFrame. Lưu ý rằng tôi không nhập tất cả các hàng trong ví dụ.

In [14]: df = data.groupby(['Country','Place'])['Value'].max()

In [15]: df.index
Out[15]: 
MultiIndex
[Spain  Manchester, UK     London    , US     Mchigan   ,        NewYork   ]

In [16]: df.index[0]
Out[16]: ('Spain', 'Manchester')

In [17]: df.index[1]
Out[17]: ('UK', 'London')

Bạn cũng có thể nhận giá trị bằng chỉ mục đó:

In [21]: for index in df.index:
    print index, df[index]
   ....:      
('Spain', 'Manchester') 512
('UK', 'London') 778
('US', 'Mchigan') 854
('US', 'NewYork') 562

Biên tập

Xin lỗi vì đã hiểu sai những gì bạn muốn, hãy thử những cách sau:

In [52]: s=data.max()

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854

chính xác. Nhưng tôi đang tìm kiếm một đầu ra một dòng có nội dung 'Hoa Kỳ, Kansas, 894'
richie

Cảm ơn. Điều này sẽ giải quyết vấn đề cho tập dữ liệu hiện tại chỉ có 1 cột có giá trị. Khi có nhiều cột hơn có giá trị, giải pháp của @ unutbu sẽ hoạt động tốt hơn. Dẫu sao cũng xin cảm ơn.
richie

5

Để in Quốc gia và Địa điểm với giá trị lớn nhất, hãy sử dụng dòng mã sau.

print(df[['Country', 'Place']][df.Value == df.Value.max()])

2

Giải pháp của tôi để tìm giá trị lớn nhất trong các cột:

df.ix[df.idxmax()]

, cũng tối thiểu:

df.ix[df.idxmin()]

2

Tôi khuyên bạn nên sử dụng nlargestđể có hiệu suất tốt hơn và mã ngắn hơn. nhập khẩupandas

df[col_name].value_counts().nlargest(n=1)

2

Bạn có thể dùng:

print (df [df ['Giá trị'] == df ['Giá trị']. max ()])


2

nhập pandas
df là khung dữ liệu bạn tạo.

Sử dụng lệnh:

df1=df[['Country','Place']][df.Value == df['Value'].max()]

Điều này sẽ hiển thị quốc gia và địa điểm có giá trị lớn nhất.


0

Tôi đã gặp lỗi tương tự khi cố gắng nhập dữ liệu bằng gấu trúc, Cột đầu tiên trên tập dữ liệu của tôi có khoảng trắng trước khi bắt đầu các từ. Tôi đã loại bỏ các khoảng trắng và nó hoạt động như một sự quyến rũ !!

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.