При попытке вызвать значение ячейки, почему мой список значений столбцов интерпретируется как значения индекса?

1

Мне нужно сделать некоторые математические вычисления, используя следующий фрейм данных. В цикле 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 dataframe, на основе которого строка 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 в качестве пятна в индексе?

Теги:
pandas
dataframe
indexing
series

2 ответа

2
Лучший ответ

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

Ни в коем случае не используйте цепочку индексирования. Например, булевское индексирование, за которым следует выбор метки столбца с помощью 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
    Я мог бы принять это слишком рано! Запустив это, я получаю ошибку: AttributeError: 'Series' object has no attribute 'items' и если я удаляю .items, я получаю TypeError: 'numpy.float64' object is not iterable что, как я полагаю, относится к проблеме с VALUE vals ,
  • 0
    Мне нужны .iteritems() вместо .items() . Теперь это работает!
Показать ещё 1 комментарий
1

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

Изменение: Вот лучший (более эффективный) ответ:

for index, row in LCdf.iterrows():
    print(row['VALUE'])
    print(row['FracDist'])
  • 0
    Несмотря на то, что этот ответ вернул меня в русло в простейшей форме, я помечаю другой как принятый, поскольку он указал мне на некоторые ключевые концепции, о которых я еще не знал, которые помогут мне в остальной части этой программы. Спасибо, в любом случае!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню