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


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.