1

I have a df with a fields Name, Age, Height.

After doing:

df.set_index('Name')

I can not longer do operations that access that column like:

len(df['Name'])

Until I do a:

df.reset_index()

Is there a better way to do this without setting and resetting the index

Alex
  • 1,891
  • 3
  • 23
  • 39

1 Answers1

0

I think you can select index by:

df.index

Or get_level_values for MultiIndex, but works also with index:

#select by position
df.index.get_level_values(0)
#select by name of level
df.index.get_level_values('Name')

So you can use:

len(df.index)

Sample:

df = pd.DataFrame({'Name':['John','Joe','Sue'],
                   'Age':[40,50,60],
                   'Height':[180,175,155]})

print (df)
   Age  Height  Name
0   40     180  John
1   50     175   Joe
2   60     155   Sue

df = df.set_index('Name')

print (df.index)
Index(['John', 'Joe', 'Sue'], dtype='object', name='Name')

print (df.index.get_level_values(0))
Index(['John', 'Joe', 'Sue'], dtype='object', name='Name')

print (df.index.get_level_values('Name'))
Index(['John', 'Joe', 'Sue'], dtype='object', name='Name')

print (len(df.index))
3
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
  • Actually my problem is a little more complicated than that. I'm trying to do something like groups = df.groupby(level=['Name', 'Field2'])['Name'].agg({'Count':'count'}) but I can't access the "Name" right before the agg call – Alex Dec 13 '16 at 07:02
  • Yes, it is more complicated. Can you explain more what need do with index level `Name` ? – jezrael Dec 13 '16 at 07:14
  • Maybe need `apply` with custom function like `groups = df.groupby(level=['Name', 'Field2']).apply(f)` where can works with level `Name` - `def f(x): print (x) name = sum(x.index.get_level_values('Name')) return pd.Series([name, x['Count'].count()], index=['Name', 'Count'])` – jezrael Dec 13 '16 at 07:27
  • The original problem I am trying to solve is here: http://stackoverflow.com/questions/41114831/convert-multiindex-dataframe-to-series – Alex Dec 13 '16 at 07:29