我需要使用以下数据框进行一些数学运算。在遍历VALUE列单元格的for循环中,我需要获取相应的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
首先,我列出了可以在for循环中使用的VALUE值的列表,该值按预期工作:
IN: LCvals = df['VALUE'].tolist()
print LCvals
OUT: [11, 21, 22, 23, 24, 31, 41, 42, 43, 52, 71, 82, 90, 95]
当我尝试根据for循环所在的VALUE行从数据框的FracDist列中抓取一个单元格时,就会出现问题。该代码不是尝试使用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]'
请注意,为VALUE = 11抓取的FracDist行来自索引11,而不是VALUE 11。
在循环代码中,要基于VALUE列中的VALUE而不是基于索引中的VALUE的行来查询行,需要做些什么改变?
答案 0 :(得分:2)
这里pd.DataFrame.loc
将首先按行标签索引,然后,如果提供第二个参数,则按列标签索引。这是设计使然。另请参见Indexing and Selecting Data。
在任何情况下都不要使用链式索引。例如,不建议布尔索引,然后通过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
答案 1 :(得分:1)
如果将整数传递到.loc
中,它将返回(在这种情况下)位于该索引处的值。您可以使用此LCdf.loc[LCdf['VALUE']==val]['FracDist']
。
编辑:这是一个更好(更有效)的答案:
for index, row in LCdf.iterrows():
print(row['VALUE'])
print(row['FracDist'])