Мне нужно сделать некоторые математические вычисления, используя следующий фрейм данных. В цикле 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 в качестве пятна в индексе?
Здесь 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
Если вы передадите целое число в .loc
, оно вернет (в данном случае) значение, расположенное в этом индексе. Вы можете использовать этот LCdf.loc[LCdf['VALUE']==val]['FracDist']
.
Изменение: Вот лучший (более эффективный) ответ:
for index, row in LCdf.iterrows():
print(row['VALUE'])
print(row['FracDist'])
AttributeError: 'Series' object has no attribute 'items'
и если я удаляю .items, я получаюTypeError: 'numpy.float64' object is not iterable
что, как я полагаю, относится к проблеме с VALUE vals ,.iteritems()
вместо.items()
. Теперь это работает!