2016-02-15 3 views
0

Я хотел бы вычислить среднее числовых столбцов, используя groupby, но поддерживая все столбцы. Примером dataframe из 7 колонок здесь:groupby и вычислять среднее значение, но сохраняя все столбцы

 
tracking_id gene_id gene_short_name tss_id locus FPKM-1 FPKM-2 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 Tss1231 1:4490927-4496413 0.611985 232 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 Ts412 1:4490927-4496413 12 21 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 Ts56 1:4490927-4496413 2 213 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 TS512 1:4490927-4496413 0.611985 5 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 TS12241 1:4490927-4496413 0.611985 51 
ENSMUSG00000096126 ENSMUSG00000096126 Gm22307 TS124 1:4529016-4529123 35 1 
ENSMUSG00000096126 ENSMUSG00000096126 Gm22307 TS-1824 1:4529016-4529123 1 2 
ENSMUSG00000096126 ENSMUSG00000096126 Gm22307 TS1249082 1:4529016-4529123 2 5 
ENSMUSG00000088000 ENSMUSG00000088000 Gm25493 TS1290328 1:4723276-4723379 0 1 
ENSMUSG00000098104 ENSMUSG00000098104 Gm6085 TS-1 1:4687933-4689403 0.0743559 6 
ENSMUSG00000033845 ENSMUSG00000033845 Mrpl15 TSS31014,TSS82987,TSS82990,TSS86849 1:4773205-4785739 79.1154 7 
ENSMUSG00000093015 ENSMUSG00000093015 Gm22463 TSS79849 1:5644644-5644745 0 1 
ENSMUSG00000025905 ENSMUSG00000025905 Oprk1 TSS15316,TSS3878,TSS6226,TSS65522 1:5588492-5606131 0 6 
ENSMUSG00000033774 ENSMUSG00000033774 Npbwr1 TSS69693 1:5913706-5917398 0 8 
ENSMUSG00000033793 ENSMUSG00000033793 Atp6v1h TSS4651 1:5083172-5162549 24.2386 9 
ENSMUSG00000087247 ENSMUSG00000087247 Fam150a TSS42747 1:6359330-6394731 0.502804 1 

Я хотел бы группе первых 3 столбцов и сохранить столбцы 4 и 5 в моем выходе (лучше всего будет первая строка каждого неоднократных столбцов 1 до 3), а затем вычислить среднее числовых столбцов в конце. Я написал это:

import pandas as pd 
df = pd.read_table('grouping.txt') 
grouped = df.groupby(list(df.columns[0:3]), sort=False).mean() 

Выход:

 
tracking_id gene_id gene_short_name FPKM-1 FPKM-2 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17 3.167191 104.4 
ENSMUSG00000096126 ENSMUSG00000096126 Gm22307 12.66666667 2.666666667 
ENSMUSG00000088000 ENSMUSG00000088000 Gm25493 0 1 
ENSMUSG00000098104 ENSMUSG00000098104 Gm6085 0.0743559 6 
ENSMUSG00000033845 ENSMUSG00000033845 Mrpl15 79.1154 7 
ENSMUSG00000093015 ENSMUSG00000093015 Gm22463 0 1 
ENSMUSG00000025905 ENSMUSG00000025905 Oprk1 0 6 
ENSMUSG00000033774 ENSMUSG00000033774 Npbwr1 0 8 
ENSMUSG00000033793 ENSMUSG00000033793 Atp6v1h 24.2386 9 
ENSMUSG00000087247 ENSMUSG00000087247 Fam150a 0.502804 1 

Выше выход, но отсутствует колонки 4 (ТСС) и 5 ​​(локус) входного файла. Как я могу сохранить эти 2 столбца (их значения различны и, следовательно, не могут быть частью столбцов groupby. Сохранение всех значений столбцов в порядке со мной, если существует один из сгруппированных элементов).

ответ

1

Вы можете объединить результаты своей группировки groupby() обратно в деблокированную версию исходного DataFrame. Возможно, что-то вроде этого:

# identify the columns we want to aggregate by; this could 
# equivalently be defined as list(df.columns[0:3]) 
group_cols = ['tracking_id', 'gene_id', 'gene_short_name'] 
# identify the columns which we want to average; this could 
# equivalently be defined as list(df.columns[4:]) 
metric_cols = ['FPKM-1', 'FPKM-2'] 

# create a new DataFrame with a MultiIndex consisting of the group_cols 
# and a column for the mean of each column in metric_cols 
aggs = df.groupby(group_cols)[metric_cols].mean() 
# remove the metric_cols from df because we are going to replace them 
# with the means in aggs 
df.drop(metric_cols, axis=1, inplace=True) 
# dedupe to leave only one row with each combination of group_cols 
# in df 
df.drop_duplicates(subset=group_cols, keep='last', inplace=True) 
# add the mean columns from aggs into df 
df = df.merge(right=aggs, right_index=True, left_on=group_cols, how='right') 
+0

выход заканчивал тем же, за исключением ввода последних колонок были заменены средними. Не думаю, что это сработало. – BioProgram

+0

@BioProgram - я неправильно понял ваш вопрос. Обновлен мой ответ на другой возможный подход ... – SPKoder

+0

Ур сценарий работает. Не могли бы вы объяснить reset_index, а затем пополнение столбцов. Я не мог понять, что на самом деле выполняется в строках 3, 4 и 5. Также, как вы написали groupby() []. Mean() отличается от того, что я написал. Не уверен, как он все еще работает. Был бы признателен, если вы можете разработать бит – BioProgram

2

Вы можете использовать aggregation, with a dict of functions применить к каждому колонку. Я использую lambda s и строчную версию функций Pandas (dataframe), так что Pandas автоматически поднимет mean().

grouped = df.groupby(list(df.columns[0:3]), sort=False).agg(
    {'FPKM-1': 'mean', 'FPKM-2': 'mean', 
    'tss_id': lambda x: x.iloc[0], 'locus': lambda x: x.iloc[0]}) 
print(grouped) 

дает:

tracking_id  gene_id   gene_short_name        tss_id  FPKM-1  FPKM-2    locus 
ENSMUSG00000025902 ENSMUSG00000025902 Sox17          Tss1231 3.167191 104.400000 1:4490927-4496413 
ENSMUSG00000096126 ENSMUSG00000096126 Gm22307          TS124 12.666667 2.666667 1:4529016-4529123 
ENSMUSG00000088000 ENSMUSG00000088000 Gm25493         TS1290328 0.000000 1.000000 1:4723276-4723379 
ENSMUSG00000098104 ENSMUSG00000098104 Gm6085          TS-1 0.074356 6.000000 1:4687933-4689403 
ENSMUSG00000033845 ENSMUSG00000033845 Mrpl15   TSS31014,TSS82987,TSS82990,TSS86849 79.115400 7.000000 1:4773205-4785739 
ENSMUSG00000093015 ENSMUSG00000093015 Gm22463          TSS79849 0.000000 1.000000 1:5644644-5644745 
ENSMUSG00000025905 ENSMUSG00000025905 Oprk1    TSS15316,TSS3878,TSS6226,TSS65522 0.000000 6.000000 1:5588492-5606131 
ENSMUSG00000033774 ENSMUSG00000033774 Npbwr1          TSS69693 0.000000 8.000000 1:5913706-5917398 
ENSMUSG00000033793 ENSMUSG00000033793 Atp6v1h          TSS4651 24.238600 9.000000 1:5083172-5162549 
ENSMUSG00000087247 ENSMUSG00000087247 Fam150a          TSS42747 0.502804 1.000000 1:6359330-6394731 
+0

спасибо, что работает, кроме одного. Столбец FPKM-1 .. в конце может содержать до 1000 столбцов. Это всегда после пятого (локус) столбца. Кроме того, в вашем скрипте столбец locus, похоже, переместился в конец. Как я могу сделать это для среднего, не имея яйца 1000 раз и локус, чтобы оставаться там, где он должен. – BioProgram

+0

Вы можете создать программный код с помощью, например, понимание диктата через соответствующие столбцы. Если столбцы локусов не имеют значения для расчетов, это только в глазах наблюдателя; вы можете указать столбцы в порядке, необходимом в качестве индекса, для группировки [list_of_column_names_in_order '] '. – Evert

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