ค้นหาค่าสูงสุดของคอลัมน์และส่งคืนค่าแถวที่เกี่ยวข้องโดยใช้ Pandas


121

โครงสร้างของข้อมูล

การใช้ Python Pandas ฉันพยายามค้นหาCountry& Placeด้วยค่าสูงสุด

สิ่งนี้ส่งคืนค่าสูงสุด:

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

แต่วิธีการที่ฉันจะได้รับที่สอดคล้องกันCountryและPlaceชื่อ?

คำตอบ:


170

สมมติว่าdfมีดัชนีที่ไม่ซ้ำกันสิ่งนี้จะให้แถวที่มีค่าสูงสุด:

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

โปรดทราบว่าidxmaxดัชนีผลตอบแทนที่ป้าย ดังนั้นหาก DataFrame มีข้อมูลซ้ำกันในดัชนีป้ายกำกับอาจระบุแถวไม่ซ้ำกันดังนั้นdf.locอาจส่งคืนมากกว่าหนึ่งแถว

ดังนั้นหากdfไม่มีดัชนีที่ไม่ซ้ำกันคุณต้องทำให้ดัชนีไม่ซ้ำกันก่อนดำเนินการตามด้านบน ขึ้นอยู่กับ DataFrame บางครั้งคุณสามารถใช้stackหรือset_indexทำให้ดัชนีไม่ซ้ำกันได้ หรือคุณสามารถรีเซ็ตดัชนี (เพื่อให้แถวเรียงลำดับใหม่โดยเริ่มต้นที่ 0):

df = df.reset_index()

ขอบคุณ. นั่นคือสิ่งที่ฉันกำลังมองหา
richie

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

สิ่งนี้จะส่งคืนทั้งแถวด้วยค่าสูงสุด


คำอธิบาย: - นิพจน์ภายในทำการตรวจสอบบูลีนตลอดความยาวของ dataFrame และดัชนีนั้นซึ่งตรงตามด้านขวามือของนิพจน์ (.max ()) จะส่งกลับดัชนีซึ่งจะเรียกแถวที่สมบูรณ์ของ dataFrame นั้น
penta

11

ประเทศและสถานที่เป็นดัชนีของซีรี่ส์หากคุณไม่ต้องการดัชนีคุณสามารถตั้งค่าas_index=False:

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

แก้ไข:

ดูเหมือนว่าคุณต้องการสถานที่ที่มีมูลค่าสูงสุดสำหรับทุกประเทศรหัสต่อไปนี้จะทำสิ่งที่คุณต้องการ:

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

ที่จะส่งคืนเฉพาะชื่อคอลัมน์และประเภท
richie

9

ฉันคิดว่าวิธีที่ง่ายที่สุดในการคืนค่าแถวที่มีค่าสูงสุดคือการรับดัชนี argmax()สามารถใช้เพื่อส่งคืนดัชนีของแถวที่มีค่ามากที่สุด

index = df.Value.argmax()

ตอนนี้ดัชนีสามารถใช้เพื่อรับคุณสมบัติสำหรับแถวนั้น:

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

8

ใช้indexแอตทริบิวต์ของDataFrame. โปรดทราบว่าฉันไม่ได้พิมพ์แถวทั้งหมดในตัวอย่าง

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

คุณยังสามารถรับค่าจากดัชนีนั้น:

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

แก้ไข

ขออภัยที่เข้าใจผิดว่าคุณต้องการอะไรลองทำตาม:

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

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

แก้ไข. แต่ฉันกำลังมองหาเอาต์พุตบรรทัดเดียวที่ระบุว่า 'US, Kansas, 894'
richie

ขอบคุณ. สิ่งนี้จะช่วยแก้ปัญหาสำหรับชุดข้อมูลปัจจุบันที่มีเพียง 1 คอลัมน์ที่มีค่า เมื่อมีคอลัมน์ที่มีโซลูชันของ values ​​@ unutbu มากขึ้นจะทำงานได้ดีขึ้น ขอบคุณต่อไป
richie

5

ในการพิมพ์ประเทศและสถานที่ที่มีค่าสูงสุดให้ใช้รหัสบรรทัดต่อไปนี้

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

2

ทางออกของฉันสำหรับการค้นหาค่าสูงสุดในคอลัมน์:

df.ix[df.idxmax()]

ขั้นต่ำ:

df.ix[df.idxmin()]

2

ฉันขอแนะนำให้ใช้nlargestเพื่อประสิทธิภาพที่ดีขึ้นและโค้ดที่สั้นลง นำเข้าpandas

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


2

นำเข้าแพนด้า
df คือกรอบข้อมูลที่คุณสร้างขึ้น

ใช้คำสั่ง:

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

ซึ่งจะแสดงประเทศและสถานที่ที่มีค่าสูงสุด


0

ฉันพบข้อผิดพลาดที่คล้ายกันขณะพยายามนำเข้าข้อมูลโดยใช้แพนด้าคอลัมน์แรกในชุดข้อมูลของฉันมีช่องว่างก่อนเริ่มคำ ฉันลบช่องว่างออกแล้วมันก็เหมือนมีเสน่ห์ !!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.