При попытке вызвать значение ячейки, почему мой список значений столбцов интерпретируется как значения индекса? - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно сделать некоторые математические расчеты, используя следующий фрейм данных.В цикле for, проходящем по ячейкам столбца VALUE, мне нужно получить соответствующий FracDist.

    VALUE  FracDist
0      11  0.022133
1      21  0.021187
2      22  0.001336
3      23  0.000303
4      24  0.000015
5      31  0.000611
6      41  0.040523
7      42  0.285630
8      43  0.161956
9      52  0.296993
10     71  0.160705
11     82  0.008424
12     90  0.000130
13     95  0.000053

Сначала я составил список значений VALUE, которые я могу использовать в цикле for, который работал, как и ожидалось:

IN: LCvals = df['VALUE'].tolist()
    print LCvals
OUT: [11, 21, 22, 23, 24, 31, 41, 42, 43, 52, 71, 82, 90, 95]

Когда я пытаюсь извлечь ячейку из столбца FracDist информационного кадра, основываясь на том, в какой строке VALUE включен цикл for, вот где возникает проблема.Вместо того, чтобы искать строки, используя VALUE из столбца VALUE, код пытается искать строки, используя VALUE в качестве индекса.Итак, что я получаю:

IN:    for val in LCvals:
            print val
            print LCdf.loc[val]['FracDist']

OUT:    11
        0.00842444155517
        21
        KeyError: 'the label [21] is not in the [index]'

Обратите внимание, что строка FracDist, которая захватывается для VALUE = 11, взята из индекса 11, а не VALUE 11.

Что необходимо изменить в этом для кода циклазапросить строки на основе VALUE в столбце VALUE, а не VALUE как место в индексе?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Здесь pd.DataFrame.loc будет индексировать сначала по метке строки, а затем, если указан второй аргумент, по метке столбца.Это по замыслу.См. Также Индексирование и выбор данных .

Ни при каких обстоятельствах не используйте цепную индексацию.Например, логическое индексирование с последующим выбором метки столбца с помощью LCdf.loc[LCdf['VALUE']==val]['FracDist'] не рекомендуется.

Если вы хотите выполнить итерацию одной серии, вы можете использовать pd.Series.items.Но здесь вы используете 'VALUE', как если бы это был индекс, поэтому вы можете сначала использовать set_index:

for val, dist in df.set_index('VALUE')['FracDist'].items():
    print(val, dist)

11 0.022133
21 0.021187
...
90 0.00013
95 5.3e-05
0 голосов
/ 27 сентября 2018

Если вы передадите целое число в .loc, оно вернет (в данном случае) значение, расположенное по этому индексу.Вы можете использовать это LCdf.loc[LCdf['VALUE']==val]['FracDist'].

Редактировать: Вот лучший (более эффективный) ответ:

for index, row in LCdf.iterrows():
    print(row['VALUE'])
    print(row['FracDist'])
...