尝试调用单元格值时,为什么我的列值列表被解释为索引值?

时间:2018-09-27 16:16:22

标签: python pandas dataframe indexing series

我需要使用以下数据框进行一些数学运算。在遍历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的行来查询行,需要做些什么改变?

2 个答案:

答案 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'])