2017-02-17 2 views
2

У меня есть кадр данных в пандах, содержащий информацию, которую я хотел бы сортировать по группам. Из каждой группы я хочу затем вычесть первое значение для определенного столбца из всего столбца в этой группе. Значения затем должны быть добавлены в блок данных как дополнительный столбец. Пример моего первоначального dataframe:Вычитание групповых значений из каждой группы

   time sample x  y  mass 

       3  1.0  216 12 12 
       4  1.0  218 13 12 
       5  1.0  217 12 12 
       6  1.0  234 13 13 
       1  2.0  361 289 23 
       2  2.0  362 287 22 
       3  2.0  362 286 22 
       5  3.0  124 56 18 
       6  3.0  126 52 17 

Что я хотел бы иметь в результате:

 sample time  x  y  mass xdiff 

     1.0  3  216 12 12  0 
     1.0  4  218 13 12  2 
     1.0  5  217 12 12  1 
     1.0  6  214 13 13  -2 
     2.0  1  361 289 23  0 
     2.0  2  362 287 22  1 
     2.0  3  362 286 22  1 
     3.0  5  124 56 18  0 
     3.0  6  126 52 17  2 

До сих пор я могу только выяснить, шт:

   s = df.groupby('sample') 
       #gives me the groups 
       s["x"].nth(0) 
       #gets the first x value of each group 

Я m просто не уверен, как вычесть первое значение x для каждой группы образцов из всех значений x в этой группе образцов. Кто-нибудь знает, как это можно сделать? Благодаря!

ответ

5

Вы можете вычитать столбец новым Series, созданное с использованием transform с first:

print (df.groupby('sample')['x'].transform('first')) 
0 216 
1 216 
2 216 
3 216 
4 361 
5 361 
6 361 
7 124 
8 124 
Name: x, dtype: int64 


df['xdiff'] = df['x'] - df.groupby('sample')['x'].transform('first') 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 

df['xdiff'] = df['x'].sub(df.groupby('sample')['x'].transform('first')) 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 

И решение с apply:

df['xdiff'] = df.groupby('sample')['x'].apply(lambda x: x - x.iloc[0]) 
print (df) 
    time sample x y mass xdiff 
0  3  1.0 216 12 12  0 
1  4  1.0 218 13 12  2 
2  5  1.0 217 12 12  1 
3  6  1.0 234 13 13  18 
4  1  2.0 361 289 23  0 
5  2  2.0 362 287 22  1 
6  3  2.0 362 286 22  1 
7  5  3.0 124 56 18  0 
8  6  3.0 126 52 17  2 
+0

спасибо! Чтобы понять это правильно - это три разных способа решения проблемы? Я понимаю третье решение, это было похоже на то, что я пытаюсь понять. – UserR6

+0

Точно, это 3 разных решения с одинаковым выходом. – jezrael

Смежные вопросы