2017-05-31 114 views
0

我有一个数据框有两个相关的列(实际上有> 2,但不认为这很重要),并且其中一列有重复。循环嵌套问题 - 值不正确

重复项位于列HAB_slice ['Radial Position']中,并以0.1为增量。

理想情况下,我想说如果HAB_slice ['Radial Position']中的两个值彼此相等,找到它们之间的绝对值差并将它们添加到运行总数中。

当前的代码看起来是这样的:

possible_pos = np.linspace(0, 1, 1/stepsize+1) 
    center_sum = 0 
    for i in range(0, len(possible_pos)): 
     temp = HAB_slice[HAB_slice['Radial Position']==possible_pos[i]] 
     if len(temp) == 2: 
      center_sum += np.abs(temp['I'].diff().values[1]) 
    print center_sum 

虽然它返回一个值,并不会引发错误,center_sum值比我手动计算它的不同。我认为这只是嵌套有问题,但我很新的循环,我不确定。

错误示例:以下数据在此代码中会生成一个center_sum = 0,但是如果您在Radial位置彼此相等时手动计算I中的绝对值差异,则它等于0.0045878。

I   Radial Position 
0.14289522 1 
0.14298554 0.9 
0.1430356 0.8 
0.1430454 0.7 
0.1430552 0.6 
0.14266456 0.5 
0.14227392 0.4 
0.14234106 0.3 
0.14286598 0.2 
0.1433909 0.1 
0.14309062 0 
0.14279034 0.1 
0.14271344 0.2 
0.14285992 0.3 
0.1430064 0.4 
0.14327248 0.5 
0.14353856 0.6 
0.14356664 0.7 
0.14335672 0.8 
0.1431468 0.9 
0.14338368 1 

编辑:我用示例代码简化了事情,试着让它工作。

test1 = [[0.14309062,0],[0.1433909,0.1], [0.14286598,0.2], [0.14234106,0.3], 
[0.14279034,0.1], [0.14271344,0.2], [0.14285992,0.3]] 
''' 
test2 = [[0.14289522,1],[0.14298554,0.9],[0.1430356,0.8],[0.1430454,0.7], 
[0.1430552,0.6],[0.14266456,0.5],[0.14227392,0.4],[0.14234106,0.3], 
[0.14286598,0.2],[0.1433909,0.1],[0.14309062,0],[0.14279034,0.1], 
[0.14271344,0.2],[0.14285992,0.3],[0.1430064,0.4],[0.14327248,0.5], 
[0.14353856,0.6],[0.14356664,0.7],[0.14335672,0.8],[0.1431468,0.9], 
[0.14338368,1]] 
''' 
stepsize = 0.1 
possible_pos = np.linspace(0, 1, 1/stepsize+1) 
HAB_slice = pd.DataFrame(test1) 
HAB_slice.columns = ['I', 'Radial Position'] 
+0

闻起来像漂浮点问题。 – Divakar

回答

0

请尝试以下代码。它应该工作。

possible_pos = np.linspace(0, 1, 1/stepsize+1) 
center_sum = 0 

for i in range(0, len(possible_pos)): 

    # retriving index position of the step value 
    indices = [i for i, x in enumerate(HAB_slice['Radial Position']) if x == possible_pos[i]] 

    # if multiple value exist for the postion 
    if len(indices) > 1: 
     values = [x for i, x in enumerate(HAB_slice['I']) if i in indices] 
     center_sum += np.abs(np.diff(values)) 

    # if single value exist for the position 
    elif len(indices) == 1: 
     center_sum += HAB_slice['I'][indices[0]] 

    # if no value exist for the position 
    else: continue 

print center_sum 
+0

感谢您的帮助!当我使用该代码时,出现索引错误:索引11超出定义索引的行的大小为11的轴0的界限。由于我不知道我在做什么,所以我甚至不知道从哪里开始寻找它所抱怨的问题。 – ShellieJ

+0

由[[0.14309062,0],[0.1433909,0.1],[0.14286598,0.2],[0.14234106,0.3],[0.14279034,0.1],[0.14271344,0.2],[0.14285992,0.3]]缩短的测试用例,它不会出错,但它也为center_sum提供了两个值,而不是一个,它们都不对应于手形计算值0.00127196 – ShellieJ

+0

i中“i for i,x”是当前索引位置(计数器)步骤值。 enumerate()函数将一个计数器作为(counter,element)添加到列表中。 – sam23