Bir sütunun maksimum değerini bulun ve Pandaları kullanarak ilgili satır değerlerini döndürün


121

Verilerin yapısı;

Python Pandas'ı kullanarak Country& Placedeğerini maksimum değerle bulmaya çalışıyorum .

Bu maksimum değeri döndürür:

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

Ancak karşılık gelen adı Countryve Placeadı nasıl alırım ?

Yanıtlar:


170

dfBenzersiz bir dizine sahip olduğu varsayılırsa , bu, satıra maksimum değeri verir:

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

idxmaxDizin etiketleri döndürdüğünü unutmayın . Dolayısıyla, DataFrame'in dizinde kopyaları varsa, etiket satırı benzersiz bir şekilde tanımlayamayabilir, bu nedenle df.locbirden fazla satır döndürebilir.

Bu nedenle, dfbenzersiz bir dizine sahip değilseniz, yukarıdaki gibi devam etmeden önce dizini benzersiz yapmalısınız. DataFrame'e bağlı olarak, bazen dizini benzersiz yapmak için stackveya kullanabilirsiniz set_index. Veya dizini basitçe sıfırlayabilirsiniz (böylece satırlar 0'dan başlayarak yeniden numaralandırılır):

df = df.reset_index()

Teşekkür ederim. Tam olarak aradığım buydu.
richie

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

Bu, maksimum değeri olan tüm satırı döndürür


Açıklama: - İç ifade, dataFrame'in uzunluğu boyunca bir boole kontrolü yapar ve ifadenin sağ tarafını karşılayan bu dizin (.max ()), sırayla o dataFrame'in tam satırını çağıran dizini döndürür
penta

11

Ülke ve yer dizinin dizinidir, dizine ihtiyacınız yoksa şunları ayarlayabilirsiniz as_index=False:

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

Düzenle:

Görünüşe göre her ülke için maksimum değere sahip bir yer istiyorsunuz, aşağıdaki kod istediğinizi yapacak:

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

bu yalnızca sütun adlarını ve dtipleri döndürecektir
richie

9

Bence maksimum değeri olan bir satırı döndürmenin en kolay yolu indeksini almaktır. argmax()en büyük değere sahip satırın dizinini döndürmek için kullanılabilir.

index = df.Value.argmax()

Artık dizin, söz konusu satırın özelliklerini almak için kullanılabilir:

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

8

indexÖzelliğini kullanın DataFrame. Örnekteki tüm satırları yazmadığımı unutmayın.

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

Değeri bu dizine göre de alabilirsiniz:

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

Düzenle

Ne istediğini yanlış anladığım için özür dilerim, aşağıdakileri deneyin:

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

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

doğru. Ancak, "ABD, Kansas, 894" yazan tek satırlık bir çıktı arıyorum
richie

Teşekkürler. Bu, değerleri olan yalnızca 1 sütun bulunan mevcut veri kümesi için sorunu çözecektir. Değerlere sahip daha fazla sütun olduğunda @ unutbu'nun çözümü daha iyi çalışır. Yine de teşekkürler.
richie

5

Ülke ve Yeri maksimum değerle yazdırmak için aşağıdaki kod satırını kullanın.

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

2

Sütunlarda maksimum değerleri bulmak için çözümüm:

df.ix[df.idxmax()]

, ayrıca minimum:

df.ix[df.idxmin()]

2

Daha nlargestiyi performans ve daha kısa kod için kullanmanızı tavsiye ederim . ithalatpandas

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

2

Kullanabilirsiniz:

(Df [df [ 'Değerini'] == df [ 'Değer']. Max ()]) yazdırmak


2

pandas
df'yi içe aktar , oluşturduğunuz veri çerçevesidir.

Şu komutu kullanın:

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

Bu, değeri maksimum olan ülkeyi ve yeri gösterecektir.


0

Pandaları kullanarak verileri içe aktarmaya çalışırken benzer bir hatayla karşılaştım, Veri kümemdeki ilk sütunda kelimelerin başlangıcından önce boşluklar vardı. Boşlukları kaldırdım ve bir cazibe gibi çalıştı!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.