Prasad
Prasad

Reputation: 175

Index values of specific rows in python

I am trying to find out Index of such rows before "None" occurs.

pId=["a","b","c","None","d","e","None"]
df = pd.DataFrame(pId,columns=['pId'])

              pId
0               a
1               b
2               c
3            None
4               d
5               e
6            None

df.index[df.pId.eq('None') & df.pId.ne(df.pId.shift(-1))]

I am expecting the output of the above code should be

Index([2,5])

It gives me

Index([3,6])

Please correct me

Upvotes: 0

Views: 126

Answers (3)

Padraic Cunningham
Padraic Cunningham

Reputation: 180441

Just -1 from df[df["pId"] == "None"].index:

import pandas as pd

pId=["a","b","c","None","d","e","None"]
df = pd.DataFrame(pId,columns=['pId'])

print(df[df["pId"] == "None"].index - 1)

Which gives you:

Int64Index([2, 5], dtype='int64')

Or if you just want a list of values:

(df[df["pId"] == "None"].index - 1).tolist()

You should be aware that for a list like:

pId=["None","None","b","c","None","d","e","None"]

You get a df like:

    pId
0  None
1  None
2     b
3     c
4  None
5     d
6     e
7  None

And output like:

[-1, 0, 3, 6]

Which does not make a great deal of sense.

Upvotes: 0

Prune
Prune

Reputation: 77857

The problem is that you're returning the index of the "None". You compare it against the previous item, but you're still reporting the index of the "None". Note that your accepted answer doesn't make this check.

In short, you still need to plaster a "-1" onto the result of your checking.

Upvotes: 0

GpG
GpG

Reputation: 512

I am not sure for the specific example you showed. Anyway, you could do it in a more simple way:

indexes = [i-1 for i,x in enumerate(pId) if x == 'None']

Upvotes: 1

Related Questions