পান্ডাস ডেটা ফ্রেমে কলামের মান সর্বাধিক যেখানে সারিটি সন্ধান করুন


208

যে সারিটির জন্য নির্দিষ্ট কলামের মান সর্বাধিক, আমি কীভাবে তা খুঁজে পাব ?

df.max() প্রতিটি কলামের সর্বাধিক মান দেবে, কীভাবে সংশ্লিষ্ট সারিটি পেতে হয় তা আমি জানি না।


শীর্ষ 2 মান পাওয়া সম্ভব? পরিবর্তে শুধুমাত্র সর্বোচ্চ?
AsheKetchum

5
আপনি ব্যবহার করতে sort_valuesএবং সূচকটি পেতে পারেন :df.sort_values('col', ascending=False)[:2].index
অলস 1

2
অলস 1: অকারণে পুরো সিরিজটিকে বাছাই করা এড়াতে হবে কারণ এটি গড়ে ও (এন লগএন), তবে সর্বাধিক / আইডেক্সম্যাক্স সন্ধান করা কেবল ও (এন)।
smci

উত্তর:


240

পান্ডাস idxmaxফাংশনটি ব্যবহার করুন । এটি সোজা:

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
          A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1
  • বিকল্প হিসাবে আপনি এটি ব্যবহার করতে পারেন numpy.argmaxযেমন numpy.argmax(df['A'])- এটি একই জিনিস সরবরাহ করে এবং কমপক্ষে idxmaxপর্যবেক্ষণে কমপক্ষে দ্রুত উপস্থিত হয় ।

  • idxmax() সূচকগুলির লেবেলগুলি প্রদান করে, পূর্ণসংখ্যা নয়।

    • উদাহরণ ': যদি আপনার সূচক লেবেলের মতো স্ট্রিং মান থাকে তবে সারিগুলি' এ 'মাধ্যমে' ই 'এর মতো হয়, আপনি জানতে চাইতে পারেন যে সর্বাধিক সারি 4-এ হয় (সারি' ডি 'নয়)।
    • যদি আপনি সেই লেবেলের পূর্ণসংখ্যা অবস্থানটি নিজের Indexহাতে পেতে চান তবে এটি নিজেই পেতে হবে (যা এখন মুশকিল হতে পারে যে সদৃশ সারি লেবেলগুলির অনুমতি রয়েছে)।

NOTতিহাসিক নোট:

  • idxmax()0.11 এর আগে ডাকা হতargmax()
  • argmax ০.০.০ এর পূর্বে অবচয় করা হয়েছিল এবং পুরোপুরি 1.0.0.0 এ সরানো হয়েছিল
  • পান্ডা 0.16 হিসাবে ফিরে, argmaxএকই ফাংশনটি উপস্থিত থাকত এবং সম্পাদন করত (যদিও এটি আরও ধীরে ধীরে চলতে দেখা গিয়েছিল idxmax)।
    • argmaxফাংশন সর্বাধিক উপাদানের সারি অবস্থানের সূচকের মধ্যে পূর্ণসংখ্যার অবস্থানটি প্রদান করে।
    • পাণ্ডাস পূর্ণসংখ্যার সূচকগুলির পরিবর্তে সারি লেবেলগুলি ব্যবহার করতে সরানো হয়েছে। অবস্থানগত পূর্ণসংখ্যা সূচকগুলি খুব সাধারণ ব্যবহৃত হত, লেবেলের চেয়ে বেশি সাধারণ, বিশেষত এমন অ্যাপ্লিকেশনগুলিতে যেখানে সদৃশ সারি লেবেলগুলি সাধারণ।

উদাহরণস্বরূপ, DataFrameসদৃশ সারি লেবেল সহ এই খেলনাটি বিবেচনা করুন :

In [19]: dfrm
Out[19]: 
          A         B         C
a  0.143693  0.653810  0.586007
b  0.623582  0.312903  0.919076
c  0.165438  0.889809  0.000967
d  0.308245  0.787776  0.571195
e  0.870068  0.935626  0.606911
f  0.037602  0.855193  0.728495
g  0.605366  0.338105  0.696460
h  0.000000  0.090814  0.963927
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

In [20]: dfrm['A'].idxmax()
Out[20]: 'i'

In [21]: dfrm.iloc[dfrm['A'].idxmax()]  # .ix instead of .iloc in older versions of pandas
Out[21]: 
          A         B         C
i  0.688343  0.188468  0.352213
i  0.879000  0.105039  0.900260

সুতরাং এখানে একটি নিরীহ ব্যবহার idxmaxযথেষ্ট নয়, যেখানে পুরানো ফর্মটি argmaxসঠিকভাবে সর্বাধিক সারিটির অবস্থানগত অবস্থান সরবরাহ করবে (এই ক্ষেত্রে, অবস্থান 9)।

এটি হ'ল ডাইনামিকালি টাইপ করা ভাষাগুলিতে এমন দুষ্টু ধরণের বাগ-প্রবণ আচরণগুলির মধ্যে একটি যা এই ধরণের জিনিসটিকে এত দুর্ভাগ্যজনক করে তোলে এবং একটি মৃত ঘোড়াটিকে মারধর করার উপযুক্ত। আপনি যদি সিস্টেম কোড লিখতে থাকেন এবং আপনার সিস্টেমটি হঠাৎ এমন কিছু ডেটা সেটগুলিতে ব্যবহার হয়ে যায় যা যোগদানের আগে সঠিকভাবে পরিষ্কার হয় না তবে ডুপ্লিকেট সারি লেবেলগুলি বিশেষত স্টুড লেবেলগুলির মতো আর্থিক সম্পদের জন্য একটি CUSIP বা SEDOL শনাক্তকারী হিসাবে শেষ করা খুব সহজ। আপনাকে সাহায্য করতে আপনি সহজেই টাইপ সিস্টেমটি ব্যবহার করতে পারবেন না এবং আপনি অপ্রত্যাশিতভাবে হারিয়ে যাওয়া ডেটা না চালিয়ে সূচকে স্বতন্ত্রতা প্রয়োগ করতে সক্ষম হতে পারবেন না।

সুতরাং আপনার ইউনিট পরীক্ষাগুলি সমস্ত কিছু কভার করেছিল এই আশায় আপনি ছেড়ে গেছেন (তারা সম্ভবত কোনও পরীক্ষা করেনি) - অন্যথায় (সম্ভবতঃ) আপনি কেবল এটিকে ধাক্কা মারছেন কিনা তা দেখার অপেক্ষা রেখে গেছেন unit রানটাইম গোমরাহী, যে ক্ষেত্রে আপনি সম্ভবত ডাটাবেসের আপনি ফলাফল outputting হয়েছে, বের করার চেষ্টা ম্যানুয়ালি সমস্যা পুনর্গঠন IPython দেয়ালে বিরুদ্ধে আপনার মাথা মুহূর্তেই থেকে ড্রপ কাজের অনেক ঘন্টা মূল্য যেতে হবে, পরিশেষে figuring আউট এটা যে কারণ idxmaxপারেন শুধুমাত্র সর্বোচ্চ সারিটির লেবেলটি রিপোর্ট করুন এবং তারপরে হতাশ হয়ে উঠছেন যে কোনও মানক ক্রিয়াকলাপ স্বয়ংক্রিয়ভাবে আপনার পক্ষে সর্বোচ্চ সারিটির অবস্থান পায় না , একটি বগি বাস্তবায়ন নিজেই লেখেন, কোড সম্পাদনা করেন এবং প্রার্থনা করেন যে আপনি আবার সমস্যাটির মধ্যে না চলে।


13
সেখানে দ্বিতীয় থেকে শেষ মন্তব্যের উপর ভিত্তি করে, এটি দেখতে মনে হচ্ছে argminএবং এর argmaxঅংশ থাকবে DataFrameএবং পার্থক্য কেবল আপনি সূচি বা লেবেল চান কিনা whether idxmaxসর্বাধিক স্থানের লেবেল আপনাকে দেয়। argmaxআপনাকে সূচী পূর্ণসংখ্যায় দেবে।
এলী

4
argmaxএবং এর মধ্যে পার্থক্য ব্যাখ্যা করার জন্য প্রদত্ত তথ্য idxmaxএবং ডুপ্লিকেট সূচক সহ কীভাবে বাগগুলি এড়ানো যায় তা দুর্দান্ত ছিল! আমি অন্য উত্তরে আপনার মন্তব্য পড়া না হওয়া পর্যন্ত আমি লক্ষ্য করেছি না। ধন্যবাদ!
টুপান

আপনি যে প্রয়োগটি প্রয়োগ করতে চান সে সম্পর্কে প্যান্ডাসগুলি 0.24.1 নীচের দিকে নির্দেশ করে: ' argmaxভবিষ্যতে অবস্থিত সর্বাধিক ফিরিয়ে আনার আচরণটি সংশোধন করা হবে। আপাতত সর্বাধিক সারিটির অবস্থানটি ব্যবহার করতে series.values.argmaxবা ব্যবহার np.argmax(np.array(values))করতে পারেন ''
স্যাম

1
একইভাবে, .ixদ্বিতীয় উদাহরণের পদ্ধতিটির পুনরায় নামকরণ করা হয়েছে.iloc
Ma0

যদি আপনার কলামে কেবল ন্যান মান রয়েছে তবে এর ফলাফল টাইপরর
ম্যাক্স সেগাল

77

আপনিও চেষ্টা করতে পারেন idxmax:

In [5]: df = pandas.DataFrame(np.random.randn(10,3),columns=['A','B','C'])

In [6]: df
Out[6]: 
          A         B         C
0  2.001289  0.482561  1.579985
1 -0.991646 -0.387835  1.320236
2  0.143826 -1.096889  1.486508
3 -0.193056 -0.499020  1.536540
4 -2.083647 -3.074591  0.175772
5 -0.186138 -1.949731  0.287432
6 -0.480790 -1.771560 -0.930234
7  0.227383 -0.278253  2.102004
8 -0.002592  1.434192 -1.624915
9  0.404911 -2.167599 -0.452900

In [7]: df.idxmax()
Out[7]: 
A    0
B    8
C    7

যেমন

In [8]: df.loc[df['A'].idxmax()]
Out[8]: 
A    2.001289
B    0.482561
C    1.579985

ধন্যবাদ ওয়েস : Idxmax জন্য ডকুমেন্টেশন () এখানে pandas.pydata.org/pandas-docs/dev/generated/...
উইল

df.ix[df['A'].idxmax()].valuesঅ্যারে ধরতে আমি চাইছিলাম। এখনো কাজ করে.
যোজিম্বো

2
নোট করুন যে ডেটা সাব-স্লাইস করার জন্য এবং / অথবা সর্বাধিক-সারিটির অবস্থানিক অবস্থানটি অর্জনের জন্য আপনাকে idxmaxএকটি ফিডার হিসাবে আউটপুটটি ব্যবহার করার চেষ্টা করার উপায় হিসাবে ixবা সতর্কতা অবলম্বন করা উচিত loc। কারণ এতে আপনার নকল থাকতে পারে Index- উদাহরণের জন্য আমার উত্তরের আপডেটটি দেখুন।
ely

25

উপরের দুটি উত্তরই কেবলমাত্র একটি সূচক ফিরবে যদি সেখানে একাধিক সারি থাকে যে সর্বাধিক মান নেয়। আপনি যদি সমস্ত সারি চান তবে কোনও ফাংশন আছে বলে মনে হয় না। তবে এটি করা কঠিন নয়। নীচে সিরিজের উদাহরণ রয়েছে; একই ডেটাফ্রেমের জন্য করা যেতে পারে:

In [1]: from pandas import Series, DataFrame

In [2]: s=Series([2,4,4,3],index=['a','b','c','d'])

In [3]: s.idxmax()
Out[3]: 'b'

In [4]: s[s==s.max()]
Out[4]: 
b    4
c    4
dtype: int64

10
ধন্যবাদ! ডেটা ফ্রেমের সংস্করণ:df[df['A'] == df['A'].max()]
ডেনিস গোলোমাজভ

এটি আসলে সঠিক উত্তর (ডেটাফ্রেম সংস্করণ)।
জেনেটে

12
df.iloc[df['columnX'].argmax()]

argmax()কলামের সর্বাধিক মানের সাথে সূচক সরবরাহ করবে। ilocএই সূচকের জন্য ডেটা ফ্রেম ডিএফের সারিটি পেতে ব্যবহার করা যেতে পারে।


4

সরাসরি ".আরগম্যাক্স ()" সমাধান আমার পক্ষে কাজ করে না।

পূর্ববর্তী উদাহরণ @ ইলি সরবরাহ করেছেন

>>> import pandas
>>> import numpy as np
>>> df = pandas.DataFrame(np.random.randn(5,3),columns=['A','B','C'])
>>> df
      A         B         C
0  1.232853 -1.979459 -0.573626
1  0.140767  0.394940  1.068890
2  0.742023  1.343977 -0.579745
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
>>> df['A'].argmax()
3
>>> df['B'].argmax()
4
>>> df['C'].argmax()
1

নিম্নলিখিত বার্তা ফেরত:

FutureWarning: 'argmax' is deprecated, use 'idxmax' instead. The behavior of 'argmax' 
will be corrected to return the positional maximum in the future.
Use 'series.values.argmax' to get the position of the maximum now.

যাতে আমার সমাধানটি হ'ল:

df['A'].values.argmax()

2
mx.iloc[0].idxmax()

কোডের এই একটি লাইন আপনাকে ডাটাফ্রেমে সারি থেকে সর্বাধিক মান কীভাবে সন্ধান করবে তা এখানে mxডেটাফ্রেম এবং iloc[0]0 তম সূচককে নির্দেশ করে।


1

idmaxDataFrame সর্বোচ্চ মান এবং আচরণ দিয়ে সারি লেবেল সূচক ফেরৎ argmaxসংস্করণ উপর নির্ভর করে pandas(ডান এখন এটি একটি সতর্কবার্তা ফেরৎ)। আপনি যদি পজিশনাল ইনডেক্স ব্যবহার করতে চান নিম্নলিখিতগুলি করতে পারেন:

max_row = df['A'].values.argmax()

অথবা

import numpy as np
max_row = np.argmax(df['A'].values)

মনে রাখবেন যে আপনি যদি ব্যবহার করেন np.argmax(df['A'])তবে একইরকম আচরণ করে df['A'].argmax()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.