पायथन पंडों: उन पंक्तियों का सूचकांक प्राप्त करें जो कॉलम निश्चित मूल्य से मेल खाते हैं


274

"BoolCol" कॉलम के साथ एक DataFrame को देखते हुए, हम DataFrame के इंडेक्स को खोजना चाहते हैं जिसमें "BoolCol" == ट्रू के लिए मान हैं

मेरे पास वर्तमान में इसे करने का तरीका है, जो पूरी तरह से काम करता है:

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

आप एक गैर-डिफ़ॉल्ट सूचकांक के साथ DataFrame के साथ खेलते हुए अंतर को स्पष्ट रूप से देख सकते हैं जो पंक्ति की संख्यात्मक स्थिति के बराबर नहीं है:

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')
फिलिप क्लाउड

3
मुझे पता है कि यह पुराना है, लेकिन मैं सोच रहा हूं कि क्या किसी क्वेरी से 0-आधारित इंडेक्स नंबर प्राप्त करने का एक आसान तरीका है। मुझे iloc नंबरों की आवश्यकता है क्योंकि मैं एक निश्चित शर्त को पूरा करने वाली एक पंक्ति से पहले और बाद में कुछ पंक्तियों का चयन करना चाहता हूं। तो मेरी योजना यह थी कि शर्त को पूरा करने वाली पंक्तियों के 0-सूचकांक प्राप्त करें और फिर इलोक () में उपयोग के लिए स्लाइस बनाएं। केवल एक चीज जो मैं देख रहा हूं वह है get_loc, लेकिन यह एक सरणी नहीं ले सकती।
sheridp

3
@sheridp: यदि आप एक बूलियन मुखौटा है, तो आप क्रमसूचक सूचकांक पा सकते हैं, जहां maskहै Trueका उपयोग करके np.flatnonzero। मैंने जो कुछ दिखाया है, उसे दिखाने के लिए मैंने ऊपर की पोस्ट संपादित की है।
unutbu

8
आपका सुझाव indices = np.flatnonzero(df[col_name] == category_name)मुझे वही मिलता है जो सवाल का शीर्षक पूछता है, जो इंटरनेट पर मिलना आश्चर्यजनक रूप से मुश्किल है।
ClimbsRocks

यदि आप केवल इंडेक्स वापस चाहते हैं, तो df [dftest] .index का ओवरहेड क्या है? क्या यह एक इंटरमीडिएट डेटा फ्रेम (जिसका डेटा जिबाबीट्स हो सकता है) बनाता है। क्या dftest के बारे में? क्या यह एक बहुत बड़ी मध्यवर्ती वस्तु को आवंटित नहीं करता है जहाँ लौटा हुआ सूचकांक बहुत छोटा हो सकता है, या खाली भी हो सकता है। क्या ये जादुई रूप से आलसी विचारों का उपयोग करके अनुकूलित हैं। यदि नहीं तो निश्चित रूप से एक कुशल तरीका होना चाहिए।
15:

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 (PS: इसका उपयोग कैसे करें कृपया लिंक की जाँच करें )

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.