Temukan nilai maksimum kolom dan kembalikan nilai baris yang sesuai menggunakan Pandas

120

Struktur data;

Menggunakan Python Pandas Saya mencoba mencari Country& Placedengan nilai maksimum.

Ini mengembalikan nilai maksimum:

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

Tapi bagaimana cara mendapatkan nama Countrydan yang sesuai Place?

richie
sumber

Jawaban:

169

Dengan asumsi dfmemiliki indeks unik, ini memberikan baris dengan nilai maksimum:

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

Perhatikan bahwa idxmaxmengembalikan label indeks . Jadi jika DataFrame memiliki duplikat dalam indeks, label mungkin tidak secara unik mengidentifikasi baris tersebut, sehingga df.locdapat mengembalikan lebih dari satu baris.

Oleh karena itu, jika dftidak memiliki indeks unik, Anda harus membuat indeks unik sebelum melanjutkan seperti di atas. Bergantung pada DataFrame, terkadang Anda dapat menggunakan stackatau set_indexmembuat indeks menjadi unik. Atau, Anda dapat mengatur ulang indeks (sehingga baris dinomori ulang, mulai dari 0):

df = df.reset_index()
unutbu
sumber
Terima kasih. Itulah yang saya cari.
richie
57
df[df['Value']==df['Value'].max()]

Ini akan mengembalikan seluruh baris dengan nilai maks

Gaurav
sumber
Penjelasan: - Ekspresi bagian dalam melakukan pemeriksaan boolean sepanjang dataFrame & indeks yang memenuhi sisi kanan ekspresi (.max ()) mengembalikan indeks, yang pada gilirannya memanggil baris lengkap dari dataFrame
penta
11

Negara dan tempat adalah indeks rangkaian, jika Anda tidak membutuhkan indeks, Anda dapat mengatur as_index=False:

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

Edit:

Tampaknya Anda menginginkan tempat dengan nilai maksimal untuk setiap negara, kode berikut akan melakukan apa yang Anda inginkan:

df.groupby("country").apply(lambda df:df.irow(df.value.argmax()))
HYRY
sumber
yang hanya akan mengembalikan nama kolom dan dtypes
richie
9

Saya pikir cara termudah untuk mengembalikan baris dengan nilai maksimum adalah dengan mendapatkan indeksnya. argmax()dapat digunakan untuk mengembalikan indeks baris dengan nilai terbesar.

index = df.Value.argmax()

Sekarang indeks dapat digunakan untuk mendapatkan fitur untuk baris tertentu itu:

df.iloc[df.Value.argmax(), 0:2]
sharad kakran
sumber
8

Gunakan indexatribut DataFrame. Perhatikan bahwa saya tidak mengetik semua baris dalam contoh.

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')

Anda juga bisa mendapatkan nilainya dengan indeks itu:

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

Edit

Maaf karena salah paham apa yang Anda inginkan, coba berikut ini:

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

In [53]: print '%s, %s, %s' % (s['Country'], s['Place'], s['Value'])
US, NewYork, 854
waitingkuo
sumber
benar. Tapi saya mencari output satu baris yang mengatakan, 'AS, Kansas, 894'
richie
Terima kasih. Ini akan menyelesaikan masalah untuk kumpulan data saat ini di mana hanya ada 1 kolom dengan nilai. Jika ada lebih banyak kolom dengan nilai @ unutbu, solusi akan bekerja lebih baik. Terima kasih.
richie
5

Untuk mencetak Negara dan Tempat dengan nilai maksimum, gunakan baris kode berikut.

print(df[['Country', 'Place']][df.Value == df.Value.max()])
Arpit Sharma
sumber
2

Solusi saya untuk menemukan nilai maksimum di kolom:

df.ix[df.idxmax()]

, juga minimum:

df.ix[df.idxmin()]
Marcin Lentner
sumber
2

Saya akan merekomendasikan penggunaan nlargestuntuk kinerja yang lebih baik dan kode yang lebih pendek. imporpandas

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

Kamu bisa memakai:

print (df [df ['Value'] == df ['Value']. ​​max ()])

kelvinkahuro
sumber
2

import pandas
df adalah bingkai data yang Anda buat.

Gunakan perintah:

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

Ini akan menampilkan negara dan tempat yang nilainya maksimal.

raksha
sumber
0

Saya mengalami kesalahan serupa saat mencoba mengimpor data menggunakan panda, Kolom pertama di kumpulan data saya memiliki spasi sebelum awal kata. Saya menghapus spasi dan itu bekerja seperti pesona !!

Jefferson Sankara
sumber