2015-07-03 65 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