2015-05-15 3 views
-1

В Pandas У меня есть кадр данных, состоящий из двух групп с несколькими образцами в каждой группе. Каждая группа имеет внутреннее ссылочное значение, которое я хочу вычесть из всех значений выборки внутри этой группы.Вычитание группового значения из строк в pandas

s = u"""Group sample value 
group1 ref1 18.1 
group1 smp1 NaN 
group1 smp2 20.3 
group1 smp3 30.0 
group2 ref2 16.1 
group2 smp4 29.2 
group2 smp5 19.9 
group2 smp6 28.9 
""" 
df = pd.read_csv(io.StringIO(s), sep='\s+') 
df = df.set_index(['Group', 'sample']) 
df 

Out[82]: 

       value  
Group sample 
group1 ref1 18.1 
     smp1 NaN 
     smp2 20.3 
     smp3 30.0 
group2 ref2 16.1 
     smp4 29.2 
     smp5 19.9 
     smp6 28.9 

То, что я хочу сделать сделать, чтобы добавить новый столбец, где ссылка (ссылка) была вычтена из всех образцов (ПСР) в пределах каждой соответствующей группы. Пример:

    value deltaValue 
SampleGroup sample    
Group1  ref  18.1 0 
       smp1  NaN  NaN 
       smp2  20.3 2.2 
       smp3  30.0 11.9 
Group2  ref2  16.1 0 
       smp4  29.2 13.1 
       smp5  19.9 3.8 
       smp6  28.9 12.8 

Кто-нибудь знает, как это можно сделать? Благодаря!

ответ

0

Сгруппируйте свою информационную рамку с sample. Затем выполните итерацию по каждой группе и получите значение выборки ref. Затем вычитаем весь столбец.

> df = pd.read_csv(io.StringIO(s), sep='\s+') 
> df['diff'] = 0 
> df_group = df.groupby('Group') 
> for index, group in df_group: 
     df['diff'][df.index.isin(group.index)] = group[group['sample'] == 'ref'+ str(index.split('group')[1])]['value'].values[0] - group['value'] 
> print df 
    Group sample value diff 
0 group1 ref1 18.1 0.0 
1 group1 smp1 NaN NaN 
2 group1 smp2 20.3 -2.2 
3 group1 smp3 30.0 -11.9 
4 group2 ref2 16.1 0.0 
5 group2 smp4 29.2 -13.1 
6 group2 smp5 19.9 -3.8 
7 group2 smp6 28.9 -12.8 
0

Вот один из способов сделать это без петель

Сначала создайте func функцию, которая идентифицирует sample, который начинается с ref, а затем вычисляет delta значение.

In [33]: def func(grp): 
    ref = grp.ix[grp['sample'].str.startswith('ref'), 'value'] 
    grp['delta'] = grp['value'] - ref.values[0] 
    return grp 

Используйте этот func и применить над dff.groupby('Group')

In [34]: dff.groupby('Group').apply(func) 
Out[34]: 
    Group sample value delta 
0 group1 ref1 18.1 0.0 
1 group1 smp1 NaN NaN 
2 group1 smp2 20.3 2.2 
3 group1 smp3 30.0 11.9 
4 group2 ref2 16.1 0.0 
5 group2 smp4 29.2 13.1 
6 group2 smp5 19.9 3.8 
7 group2 smp6 28.9 12.8 

Чтобы начать с dff должно быть, как, которые могут быть созданы как dff = df.reset_index()

In [35]: dff 
Out[35]: 
    Group sample value 
0 group1 ref1 18.1 
1 group1 smp1 NaN 
2 group1 smp2 20.3 
3 group1 smp3 30.0 
4 group2 ref2 16.1 
5 group2 smp4 29.2 
6 group2 smp5 19.9 
7 group2 smp6 28.9 
Смежные вопросы