2015-07-03 66 views
1

我需要写一个小的脚本,通过一些数据来获得(约50,000列/文件)和我原来的文件看起来像这样:循环通过GROUPBY和添加新的一列

Label ID TRACK_ID QUALITY POSITION_X POSITION_Y POSITION_Z POSITION_T FRAME RADIUS VISIBILITY MANUAL_COLOR MEAN_INTENSITY MEDIAN_INTENSITY MIN_INTENSITY MAX_INTENSITY TOTAL_INTENSITY STANDARD_DEVIATION ESTIMATED_DIAMETER CONTRAST SNR 
    ID1119 1119 9  6.672  384.195  122.923 0 0 0 5 1 -10921639 81.495 0 0 255 7905 119.529 5.201 1 0.682 
    ID2237 2237 9  7.078  381.019  122.019 0 1 1 5 1 -10921639 89.381 0 0 255 8670 122.301 5.357 1 0.731 
    ID2512 2512 9  7.193  377.739  120.125 0 2 2 5 1 -10921639 92.01 0 0 255 8925 123.097 5.356 1 0.747 
    (...) 
    ID1102 1102 18  4.991  808.857  59.966 0 0 0 5 1 -10921639 52.577 0 0 255 5100 103.7 4.798 1 0.507 
    (...) 

它是一个相当大的高达50k行的表格。现在不是所有的数据都对我很重要,我主要需要Track_ID和X和Y位置。 所以我创建使用Excel文件中的数据帧,并只能访问相应的列

IN df = pd.read_excel('.../sample.xlsx', 'Sheet1',parse_cols="D, F,G") 

而这按预期工作。每个track_id基本上都是需要分析的一组数据。因此,最简单的方法是按照track_id对数据帧进行分组。

IN Grouping = df.groupby("TRACK_ID") 

也按预期工作。现在我需要获取每个组的第一个POSITION_X值,并将它们从该组中的其他POSITION_X值中减去。 现在,我已经读过循环可能不是最好的方式去做,但我不知道如何去做。

for name, group in Grouping: 
    first_X = group.iloc[0, 1] 
    vect = group.iloc[1:,1] - first_X  

这存储在vect中的值,如果我打印它,给我正确的值。但是,我有问题,我不知道如何将其添加到新列。 也许有人可以引导我走向正确的方向。提前致谢。

编辑 这是由chappers建议

def f(grouped): 
    grouped.iloc[1:] = 0 
    return grouped 

grouped = df.groupby('TRACK_ID') 
df['Calc'] = grouped['POSITION_X'].apply(lambda x: x - x.iloc[0]) grouped['POSITION_X'].apply(f) 
for name, group in grouped: 
    print name 
    print group 

Input:  
    TRACK_ID POSITION_X POSITION_Y 
0   9  384.195  122.923 
1   9  381.019  122.019 
2   9  377.739  120.125 
3   9  375.211  117.224 
4   9  373.213  113.938 
5   9  371.625  110.161 
6   9  369.803  106.424 
7   9  367.717  103.239 
8   18  808.857  59.966 
9   18  807.715  61.032 
10  18  808.165  63.133 
11  18  810.147  64.853 
12  18  812.084  65.084 
13  18  812.880  63.683 
14  18  812.083  62.203 
15  18  810.041  61.188 
16  18  808.568  62.260 

Output for group == 9 
    TRACK_ID POSITION_X POSITION_Y  Calc 
0   9  384.195  122.923 384.195 
1   9  381.019  122.019 -3.176 
2   9  377.739  120.125 -6.456 
3   9  375.211  117.224 -8.984 
4   9  373.213  113.938 -10.982 
5   9  371.625  110.161 -12.570 
6   9  369.803  106.424 -14.392 
7   9  367.717  103.239 -16.478 

因此,预期产出将是各组的第一个计算值是0

+0

不知道另一种方法的其他然后一个循环,但跟踪的值的只是把它们添加到一个新的列表。 'new_list = [] 循环开始: 做一些东西 new_list.append(VECT)' – kaminsknator

回答

0

这里是接近它的一种方式,使用应用方法从所有其他obs中减去第一个项目。

df = DataFrame({'A' : ['foo', 'foo', 'foo', 'foo', 
          'bar', 'bar', 'bar', 'bar'], 
        'C' : [1,2,3,4,4,3,2,1]}) 

grouped = df.groupby('A') 
df['C1'] = grouped['C'].apply(lambda x: x - x.iloc[0]) 

这将对输入:

 A C 
0 foo 1 
1 foo 2 
2 foo 3 
3 foo 4 
4 bar 4 
5 bar 3 
6 bar 2 
7 bar 1 

和输出

 A C C1 
0 foo 1 0 
1 foo 2 1 
2 foo 3 2 
3 foo 4 3 
4 bar 4 0 
5 bar 3 -1 
6 bar 2 -2 
7 bar 1 -3 
+0

多谢,原则上它工作得很好,我很喜欢你短的路。我从来没有真正与lambda运算符合作过,因此我现在只是在阅读它们。一个问题是,0的值最好返回0而不是最初的X值。任何想法? – Clemens

+0

您能提供预期的输入/输出吗?我不太明白你的意思。 – chappers

+0

我不遵循,你能发布一个我可以重现的最小数据集,显示你的期望输入和输出吗? – chappers