2017-01-12 4 views
1

У меня есть dataframe DFприбудет метка индекса в панде мультииндекса dataframe

    c1  c2 
name  sample 
person1 a1  aaa AAA 
      b1  bbb BBB 
      c1  ccc CCC 
person2 d1  ... 

Я хочу, чтобы перебирать dataframe, один человек за один раз, и убедитесь, что значения в столбцах совпадают критерий. Если я получу совпадение, я бы хотел извлечь метку для этого индекса (на уровне [1] и как строку) и создать набор всех таких индексов. Поэтому скажите, что мои критерии таковы, что column_value == bbb, тогда я хотел бы получить «b1»

Следующие производит почти то, что я хочу, но возвращает множество объектов-генераторов, а не имена ярлыков как строки.

index_set = set() 
for person, new_df in df.groupby(level=0): 
    idx = new_df.index.get_level_values(1).tolist() 
    index_set.add(x for x in idx) 

который производит что-то вроде на 0x0000022F6F05D200>, в 0x0000022F6F05D410>, ....

Так как сделать это производить что-то вроде { "b1", "f1", "h1", .. .} вместо этого?

И еще один вопрос: при итерации через df путем создания new_df имена индексов не передаются в new_df. Можно ли это как-то избежать? Это сделало бы код более читаемым, если бы я мог ссылаться на индекс как get_level_values ​​('sample'), а не get_level_values ​​(1)

ответ

1

Метод набора добавляет один элемент, в вашем случае он добавляет итератор. Вы можете использовать список, чтобы добавить несколько: [index_set.add(x) for x in idx], но правильный способ - использовать метод update:

index_set.update(idx)