Почему я не получаю правильного индекса при извлечении df.index? - PullRequest
0 голосов
/ 13 апреля 2019

Вместо значений индекса я получаю своего рода итерацию.

У меня есть датафрейм. Я разрезаю этот фрейм данных. Затем я преобразую этот фрейм данных в массив numpy, чтобы извлечь уникальные значения из среза. Затем я преобразовываю массив numpy обратно в фрейм данных. Затем я запускаю цикл for для извлечения индекса значений исходного среза кадра данных, которые соответствуют уникальным значениям. Я получаю странное поведение.

df = pd.read_excel('Book2.xlsm')
v =  (df.loc[:, 'test'].values)
g = np.unique(v, return_index=True)
v2 = pd.DataFrame(g)

for v2 in df.loc[:, 'test']:
    print (df.index)

Странное поведение, о котором я говорил:

RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)
RangeIndex(start=0, stop=14465, step=1)

Я получаю 14465 строк выше. Но нет значения индекса

Пример кадра данных


test   age
0      17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  23.0
1      17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  26.0
2                    17 ALPHA HYDROXY PROGESTERONE  18.0
3                    17 ALPHA HYDROXY PROGESTERONE  18.0
4                    17 ALPHA HYDROXY PROGESTERONE  21.0
5                    17 ALPHA HYDROXY PROGESTERONE  25.0
6                    17 ALPHA HYDROXY PROGESTERONE  27.0
7                      24 hrs URINE FOR CREATININE  32.0
8                      24 hrs URINE FOR CREATININE  43.0
9                      24 hrs URINE FOR CREATININE  52.0
10                     24 hrs URINE FOR CREATININE  53.0
11                     24 hrs URINE FOR CREATININE  56.0
12                     24 hrs URINE FOR CREATININE  57.0
13                     24 hrs URINE FOR CREATININE  57.0
14                     24 hrs URINE FOR CREATININE  57.0
15                     24 hrs URINE FOR CREATININE  58.0
16                     24 hrs URINE FOR CREATININE  62.0
17                     24 hrs URINE FOR CREATININE  85.0
18                        24 hrs URINE FOR PROTEIN   3.0
19                        24 hrs URINE FOR PROTEIN   5.0
20                        24 hrs URINE FOR PROTEIN   5.0
21                        24 hrs URINE FOR PROTEIN  16.0
22                        24 hrs URINE FOR PROTEIN  25.0
23                        24 hrs URINE FOR PROTEIN  27.0
24                        24 hrs URINE FOR PROTEIN  28.0
25                        24 hrs URINE FOR PROTEIN  32.0
26                        24 hrs URINE FOR PROTEIN  32.0
27                        24 hrs URINE FOR PROTEIN  32.0
28                        24 hrs URINE FOR PROTEIN  33.0
29                        24 hrs URINE FOR PROTEIN  34.0

Ouput должно быть примерно так:

[0:1]
[2:6]
[7:17]
[18:29]

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Примечание: В настоящее время опубликовано более точное решение относительно новых вариантов постановки задачи ОП. Я поддерживаю это решение как еще один ориентир на будущее.


Если вы хотите извлечь только первый индекс уникальности, возможно, вы захотите попробовать drop_duplicates вместо этого?

import pandas as pd
data = {'x': ['does', 'this', 'index', 'solve', 'anything', 'your', 'what', 'issue?'], 
        'y': ['a', 'b', 'b', 'c', 'a', 'd', 'd', 'e']}

df = pd.DataFrame(data).set_index('x')
print (df)

Что дает:

enter image description here

Теперь, чтобы получить уникальные индексы y ,

unique = df.drop_duplicates(subset=['y'], keep='first')
unique.index

Дает:

Index(['does', 'this', 'solve', 'your', 'issue?'], dtype='object', name='x')

Надеюсь, это поможет.

1 голос
/ 13 апреля 2019

IIUC, использование:

df.drop_duplicates('test').combine_first(df.drop_duplicates('test',keep='last'))

                                        test   age
0  17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  23.0
1  17 - Alpha OH PROGESTERONE - HORMONE ASSAYS  26.0
2                17 ALPHA HYDROXY PROGESTERONE  18.0
6                17 ALPHA HYDROXY PROGESTERONE  27.0
......................
.....................

Другое возможное решение с groupby():

df.groupby('test')['test'].apply(lambda x:[ x.index[0],x.index[-1]])

test
17 - Alpha OH PROGESTERONE - HORMONE ASSAYS      [0, 1]
17 ALPHA HYDROXY PROGESTERONE                    [2, 6]
24 hrs URINE FOR CREATININE                     [7, 17]
24 hrs URINE FOR PROTEIN                       [18, 29]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...