মাল্টি-ইনডেক্স প্যান্ডা থেকে নির্বাচন করা


91

আমার কাছে কলাম 'এ' এবং 'বি' সহ একাধিক সূচক ডেটা ফ্রেম রয়েছে।

একক কলাম সূচকে সূচিটি পুনরায় সেট না করে মাল্টি-ইনডেক্সের একটি কলামে ফিল্টার করে সারি নির্বাচন করার কোনও উপায় আছে কি?

উদাহরণ স্বরূপ.

# has multi-index (A,B)
df
#can I do this? I know this doesn't work because the index is multi-index so I need to     specify a tuple

df.ix[df.A ==1]


সম্পর্কিত: পান্ডাস মাল্টিআইডেক্স ডেটাফ্রেমে সারি নির্বাচন করুন (আমার দ্বারা একই বিষয়ে একটি বিস্তৃত আলোচনা)।
— cs95

উত্তর:


136

একটি উপায় হ'ল get_level_valuesসূচি পদ্ধতিটি ব্যবহার করা :

In [11]: df
Out[11]:
     0
A B
1 4  1
2 5  2
3 6  3

In [12]: df.iloc[df.index.get_level_values('A') == 1]
Out[12]:
     0
A B
1 4  1

0.13 এ আপনি যুক্তি xsসহdrop_level ব্যবহার করতে সক্ষম হবেন :

df.xs(1, level='A', drop_level=False) # axis=1 if columns

দ্রষ্টব্য: যদি এটি সূচকের চেয়ে কলাম মাল্টিআইডেক্স হয়, আপনি একই কৌশলটি ব্যবহার করতে পারেন:

In [21]: df1 = df.T

In [22]: df1.iloc[:, df1.columns.get_level_values('A') == 1]
Out[22]:
A  1
B  4
0  1

53

queryযা আপনি আমার মতে খুব পঠনযোগ্য এবং ব্যবহারের জন্য সহজবোধ্য তাও ব্যবহার করতে পারেন:

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [10, 20, 50, 80], 'C': [6, 7, 8, 9]})
df = df.set_index(['A', 'B'])

      C
A B    
1 10  6
2 20  7
3 50  8
4 80  9

আপনার মনে মনে যা ছিল সেটির জন্য আপনি এখন সহজভাবে করতে পারেন:

df.query('A == 1')

      C
A B    
1 10  6

আপনার ব্যবহার করে আরও জটিল প্রশ্ন থাকতে পারে and

df.query('A >= 1 and B >= 50')

      C
A B    
3 50  8
4 80  9

এবং or

df.query('A == 1 or B >= 50')

      C
A B    
1 10  6
3 50  8
4 80  9

আপনি বিভিন্ন সূচী স্তরের উপরও জিজ্ঞাসা করতে পারেন , যেমন

df.query('A == 1 or C >= 8')

ফিরে আসবে

      C
A B    
1 10  6
3 50  8
4 80  9

আপনি যদি আপনার প্রশ্নের ভিতরে ভেরিয়েবল ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন@ :

b_threshold = 20
c_threshold = 8

df.query('B >= @b_threshold and C <= @c_threshold')

      C
A B    
2 20  7
3 50  8

4
দুর্দান্ত উত্তর, সত্যিই আরও পাঠযোগ্য। : আপনি কি জানেন, এটি মত বিভিন্ন সূচক স্তরের উপর দুই ক্ষেত্র অনুসন্ধান করা সম্ভব কিdf.query('A == 1 or C >= 8')
— obchardon

@ ওব্যাকার্ডন: মনে হচ্ছে এটি ঠিকঠাক কাজ করছে; আমি আপনার উদাহরণটি ব্যবহার করে আমার উত্তর সম্পাদনা করেছি।
— ক্লিব

4
আমার মাল্টিইন্ডেক্স হিসাবে সময় এবং স্ট্রিং রয়েছে যা স্ট্রিং এক্সপ্রেশনটিতে সমস্যা তৈরি করে। তবে, df.query()ভেরিয়েবলগুলির সাথে ঠিকঠাক কাজ করে যদি তারা পরিবেশে df.query('A == @varপরিবর্তনের জন্য ক্যোয়ারী অভিব্যক্তির ভিতরে '@' দিয়ে রেফার করা হয় var।
— সোলি

@ সলি: ধন্যবাদ, আমি এটি উত্তরে যুক্ত করেছি।
— ক্লাব

যদিও এখানে মাল্টি ইনডেক্সিং?
— লামমা

32

আপনি ব্যবহার করতে পারেন DataFrame.xs():

In [36]: df = DataFrame(np.random.randn(10, 4))

In [37]: df.columns = [np.random.choice(['a', 'b'], size=4).tolist(), np.random.choice(['c', 'd'], size=4)]

In [38]: df.columns.names = ['A', 'B']

In [39]: df
Out[39]:
A      b             a
B      d      d      d      d
0 -1.406  0.548 -0.635  0.576
1 -0.212 -0.583  1.012 -1.377
2  0.951 -0.349 -0.477 -1.230
3  0.451 -0.168  0.949  0.545
4 -0.362 -0.855  1.676 -2.881
5  1.283  1.027  0.085 -1.282
6  0.583 -1.406  0.327 -0.146
7 -0.518 -0.480  0.139  0.851
8 -0.030 -0.630 -1.534  0.534
9  0.246 -1.558 -1.885 -1.543

In [40]: df.xs('a', level='A', axis=1)
Out[40]:
B      d      d
0 -0.635  0.576
1  1.012 -1.377
2 -0.477 -1.230
3  0.949  0.545
4  1.676 -2.881
5  0.085 -1.282
6  0.327 -0.146
7  0.139  0.851
8 -1.534  0.534
9 -1.885 -1.543

আপনি যদি Aস্তরটি রাখতে চান ( drop_levelকীওয়ার্ড আর্গুমেন্টটি কেবলমাত্র v0.13.0 থেকে শুরু হবে):

In [42]: df.xs('a', level='A', axis=1, drop_level=False)
Out[42]:
A      a
B      d      d
0 -0.635  0.576
1  1.012 -1.377
2 -0.477 -1.230
3  0.949  0.545
4  1.676 -2.881
5  0.085 -1.282
6  0.327 -0.146
7  0.139  0.851
8 -1.534  0.534
9 -1.885 -1.543

4
হা, আমি এটি দিয়ে আমার উত্তরটি আপডেট করেছিলাম, দ্রষ্টব্য: কেবলমাত্র 0.13 এ উপলব্ধ available
— অ্যান্ডি হেডেন

ওহ, জেনে রাখা ভাল। আমি মনে করি না প্রতিটি সংস্করণে কোন সামান্য সুবিধা যুক্ত করা হয়।
— ফিলিপ মেঘ

হ্যাঁ, আসলে এই প্রশ্নটি সেই সুযোগের এক দ্বিগুণ যা সেই সুবিধাকে অনুপ্রাণিত করেছিল! :)
— অ্যান্ডি হেডেন

13

মাল্টি-ইনডেক্সড প্যান্ডাস ডেটাফ্রেম কীভাবে অ্যাক্সেস করবেন তা বোঝা আপনাকে সেই জাতীয় সমস্ত ধরণের কাজে সহায়তা করতে পারে।

উদাহরণ তৈরি করতে আপনার কোডটিতে এটি অনুলিপি করুন:

# hierarchical indices and columns
index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],
                                   names=['year', 'visit'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],
                                     names=['subject', 'type'])

# mock some data
data = np.round(np.random.randn(4, 6), 1)
data[:, ::2] *= 10
data += 37

# create the DataFrame
health_data = pd.DataFrame(data, index=index, columns=columns)
health_data

আপনাকে এর মতো টেবিল দেবে:

এখানে চিত্র বর্ণনা লিখুন

কলাম অনুসারে স্ট্যান্ডার্ড অ্যাক্সেস

health_data['Bob']
type       HR   Temp
year visit      
2013    1   22.0    38.6
        2   52.0    38.3
2014    1   30.0    38.9
        2   31.0    37.3


health_data['Bob']['HR']
year  visit
2013  1        22.0
      2        52.0
2014  1        30.0
      2        31.0
Name: HR, dtype: float64

# filtering by column/subcolumn - your case:
health_data['Bob']['HR']==22
year  visit
2013  1         True
      2        False
2014  1        False
      2        False

health_data['Bob']['HR'][2013]    
visit
1    22.0
2    52.0
Name: HR, dtype: float64

health_data['Bob']['HR'][2013][1]
22.0

সারি দ্বারা অ্যাক্সেস

health_data.loc[2013]
subject Bob Guido   Sue
type    HR  Temp    HR  Temp    HR  Temp
visit                       
1   22.0    38.6    40.0    38.9    53.0    37.5
2   52.0    38.3    42.0    34.6    30.0    37.7

health_data.loc[2013,1] 
subject  type
Bob      HR      22.0
         Temp    38.6
Guido    HR      40.0
         Temp    38.9
Sue      HR      53.0
         Temp    37.5
Name: (2013, 1), dtype: float64

health_data.loc[2013,1]['Bob']
type
HR      22.0
Temp    38.6
Name: (2013, 1), dtype: float64

health_data.loc[2013,1]['Bob']['HR']
22.0

কাটা মাল্টি-ইনডেক্স

idx=pd.IndexSlice
health_data.loc[idx[:,1], idx[:,'HR']]
    subject Bob Guido   Sue
type    HR  HR  HR
year    visit           
2013    1   22.0    40.0    53.0
2014    1   30.0    52.0    45.0

এটি ValueError: cannot handle a non-unique multi-index!ত্রুটি দেয়
— কোডি

5

আপনি ব্যবহার করতে পারেন DataFrame.loc:

>>> df.loc[1]

উদাহরণ

>>> print(df)
       result
A B C        
1 1 1       6
    2       9
  2 1       8
    2      11
2 1 1       7
    2      10
  2 1       9
    2      12

>>> print(df.loc[1])
     result
B C        
1 1       6
  2       9
2 1       8
  2      11

>>> print(df.loc[2, 1])
   result
C        
1       7
2      10

এটি আধুনিক পদ্ধতির আইএমওর মধ্যে সেরা, যেখানে df.loc [2, 1] ['ফলাফল'] একাধিক কলামগুলি পরিচালনা করবে
— মাইকেল

এটি কোনও কারণে কোনও সংখ্যক পূর্ণসংখ্যার সাথে কাজ করে। যেমনdf.loc[0], df.loc[1]....df.loc[n]
— কোডি

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