পাইথন পান্ডাস: সারিগুলির সূচক পান যা কলামটি নির্দিষ্ট মানের সাথে মেলে


274

"কুল কলাম" কলাম সহ একটি ডেটা ফ্রেম দেওয়া, আমরা ডেটা ফ্রেমের সূচীগুলি খুঁজতে চাই যেখানে "বুলকল" এর মান == সত্য

আমার কাছে বর্তমানে এটি করার পুনরাবৃত্তি পদ্ধতি রয়েছে যা নিখুঁতভাবে কাজ করে:

for i in range(100,3000):
    if df.iloc[i]['BoolCol']== True:
         print i,df.iloc[i]['BoolCol']

তবে এটি করার জন্য এটি সঠিক পান্ডার উপায় নয়। কিছু গবেষণা করার পরে, আমি বর্তমানে এই কোডটি ব্যবহার করছি:

df[df['BoolCol'] == True].index.tolist()

এটি আমাকে সূচকগুলির একটি তালিকা দেয়, তবে তারা মেলে না, যখন আমি এগুলি করে পরীক্ষা করি:

df.iloc[i]['BoolCol']

ফলাফল আসলে মিথ্যা !!

এটি করার সঠিক পাণ্ডগুলি কোনটি হবে?

উত্তর:


425

df.iloc[i]এর ithসারি প্রদান করে dfiসূচক লেবেলকে উল্লেখ করে না, iএটি 0-ভিত্তিক সূচক।

বিপরীতে, বৈশিষ্ট্যটিindex সংখ্যার সারি-সূচকগুলি নয়, প্রকৃত সূচক লেবেলগুলি দেয় :

df.index[df['BoolCol'] == True].tolist()

বা সমতুল্য,

df.index[df['BoolCol']].tolist()

আপনি একটি ডিফল্ট সূচকের সাথে একটি ডেটা ফ্রেমের সাথে খেলতে পার্থক্যটি বেশ স্পষ্ট দেখতে পাচ্ছেন যা সারিটির সংখ্যাসূচক অবস্থানের সমান নয়:

df = pd.DataFrame({'BoolCol': [True, False, False, True, True]},
       index=[10,20,30,40,50])

In [53]: df
Out[53]: 
   BoolCol
10    True
20   False
30   False
40    True
50    True

[5 rows x 1 columns]

In [54]: df.index[df['BoolCol']].tolist()
Out[54]: [10, 40, 50]

আপনি যদি সূচকটি ব্যবহার করতে চান ,

In [56]: idx = df.index[df['BoolCol']]

In [57]: idx
Out[57]: Int64Index([10, 40, 50], dtype='int64')

তারপরে আপনি এর locপরিবর্তে সারিগুলি নির্বাচন করতে পারেনiloc :

In [58]: df.loc[idx]
Out[58]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]

নোট যে locবুলিয়ান অ্যারে গ্রহণ করতে পারে :

In [55]: df.loc[df['BoolCol']]
Out[55]: 
   BoolCol
10    True
40    True
50    True

[3 rows x 1 columns]

আপনার যদি বুলিয়ান অ্যারে থাকে maskএবং সাধারণ সূচক মানগুলির প্রয়োজন হয় তবে আপনি সেগুলি ব্যবহার করে তা গুণতে পারেনnp.flatnonzero :

In [110]: np.flatnonzero(df['BoolCol'])
Out[112]: array([0, 3, 4])

df.ilocঅর্ডিনাল সূচক দ্বারা সারি নির্বাচন করতে ব্যবহার করুন:

In [113]: df.iloc[np.flatnonzero(df['BoolCol'])]
Out[113]: 
   BoolCol
10    True
40    True
50    True

9
তবুও আরেকটি উপায় হচ্ছে df.query('BoolCol')
ফিলিপ মেঘ 21

3
আমি জানি এটি পুরানো, তবে আমি জিজ্ঞাসা করছি যে কোয়েরি থেকে 0-ভিত্তিক সূচী নম্বরগুলি পাওয়ার সহজ উপায় আছে কিনা। আমার আইলোক সংখ্যাগুলি প্রয়োজন কারণ আমি একটি নির্দিষ্ট শর্ত পূরণের আগে এবং পরে কিছু সারি নির্বাচন করতে চাই। সুতরাং আমার পরিকল্পনাটি ছিল শর্ত পূরণ করে সারিগুলির 0 সূচকগুলি পাওয়া এবং তারপরে আইলোক () এ ব্যবহারের জন্য স্লাইস তৈরি করা। আমি যা দেখছি তা হল get_loc, তবে এটি অ্যারে নিতে পারে না।
শিরিডপ

3
@sheridp: আপনি একটি বুলিয়ান মাস্ক থাকে, তাহলে আপনি পূরণবাচক সূচকের জানতে পারেন যেখানে maskহয় Trueব্যবহার করে np.flatnonzero। আমি কী বলতে চাইছি তা বোঝাতে আমি উপরে পোস্টটি সম্পাদনা করেছি।
আনতুবু

8
আপনার পরামর্শটি indices = np.flatnonzero(df[col_name] == category_name)প্রশ্নের শিরোনামের অনুরোধে আমাকে ঠিক কীটি পেয়েছে, যা ইন্টারনেটে আশ্চর্যজনকভাবে খুঁজে পাওয়া শক্ত।
ক্লাইমব্রোকস

আপনি যদি কেবল সূচকটি ফিরে চান, তবে ডিএফ [ডেসটেষ্ট] .আইডেক্সের ওভারহেডটি কী? এটি কি মধ্যবর্তী ডেটা ফ্রেম তৈরি করে (যার ডেটা গিগাবাইট হতে পারে)। ডিস্টেস্টের কী হবে? এটি কি খুব বড় একটি মাঝারি অবজেক্টকে বরাদ্দ করে না যেখানে প্রত্যাবর্তিত সূচকটি খুব ছোট বা খালিও হতে পারে। এগুলি কি অলস দৃষ্টিভঙ্গি ব্যবহার করে দূরে যাদুকরীভাবে অনুকূলিত হয়েছে? যদি না হয় তবে অবশ্যই একটি কার্যকর উপায় থাকতে হবে।
ব্যবহারকারী 48956

31

যেখানে () ফাংশনটি নামী ব্যবহার করে করা যেতে পারে:

import pandas as pd
import numpy as np

In [716]: df = pd.DataFrame({"gene_name": ['SLC45A1', 'NECAP2', 'CLIC4', 'ADC', 'AGBL4'] , "BoolCol": [False, True, False, True, True] },
       index=list("abcde"))

In [717]: df
Out[717]: 
  BoolCol gene_name
a   False   SLC45A1
b    True    NECAP2
c   False     CLIC4
d    True       ADC
e    True     AGBL4

In [718]: np.where(df["BoolCol"] == True)
Out[718]: (array([1, 3, 4]),)

In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0])

In [720]: df.iloc[select_indices]
Out[720]: 
  BoolCol gene_name
b    True    NECAP2
d    True       ADC
e    True     AGBL4

যদিও আপনাকে ম্যাচের জন্য সর্বদা সূচকের প্রয়োজন হয় না, তবে আপনার যদি প্রয়োজন হয় তবে:

In [796]: df.iloc[select_indices].index
Out[796]: Index([u'b', u'd', u'e'], dtype='object')

In [797]: df.iloc[select_indices].index.tolist()
Out[797]: ['b', 'd', 'e']

2

সহজ উপায় হ'ল ফিল্টারিংয়ের আগে ডেটা ফ্রেমের সূচি পুনরায় সেট করা:

df_reset = df.reset_index()
df_reset[df_reset['BoolCol']].index.tolist()

বিট হ্যাকি, তবে তাড়াতাড়ি!


1

প্রথমে আপনি queryলক্ষ্য কলামটি টাইপ bool করতে পারেন তা পরীক্ষা করতে পারেন (পিএস: এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে দয়া করে লিঙ্কটি পরীক্ষা করুন )

df.query('BoolCol')
Out[123]: 
    BoolCol
10     True
40     True
50     True

আমরা বুলিয়ান কলাম দ্বারা মূল ডিএফ ফিল্টার করার পরে আমরা সূচকটি বেছে নিতে পারি।

df=df.query('BoolCol')
df.index
Out[125]: Int64Index([10, 40, 50], dtype='int64')

এছাড়াও পান্ডাস আছে nonzero, আমরা শুধু নির্বাচন অবস্থানে এর Trueসারি এবং এটি যেভাবেই ব্যবহার DataFrameবাindex

df.index[df.BoolCol.nonzero()[0]]
Out[128]: Int64Index([10, 40, 50], dtype='int64')

1

আপনি যদি একবারে আপনার ডেটাফ্রেম অবজেক্টটি ব্যবহার করতে চান তবে ব্যবহার করুন:

df['BoolCol'].loc[lambda x: x==True].index

0

আমি এই প্রশ্নের সেটা কিভাবে পায় বাড়ানো row, columnএবং valueসমস্ত মিল মান?

সমাধান এখানে:

import pandas as pd
import numpy as np


def search_coordinate(df_data: pd.DataFrame, search_set: set) -> list:
    nda_values = df_data.values
    tuple_index = np.where(np.isin(nda_values, [e for e in search_set]))
    return [(row, col, nda_values[row][col]) for row, col in zip(tuple_index[0], tuple_index[1])]


if __name__ == '__main__':
    test_datas = [['cat', 'dog', ''],
                  ['goldfish', '', 'kitten'],
                  ['Puppy', 'hamster', 'mouse']
                  ]
    df_data = pd.DataFrame(test_datas)
    print(df_data)
    result_list = search_coordinate(df_data, {'dog', 'Puppy'})
    print(f"\n\n{'row':<4} {'col':<4} {'name':>10}")
    [print(f"{row:<4} {col:<4} {name:>10}") for row, col, name in result_list]

আউটপুট:

          0        1       2
0       cat      dog        
1  goldfish           kitten
2     Puppy  hamster   mouse


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