Объединить фреймы данных в столбце с количеством уникальных идентификаторов

#python #pandas #transform #combinations

#python #панды #преобразовать #комбинации

Вопрос:

У меня есть 4 фрейма данных:

 symptoms = pd.DataFrame(columns=['subject', 'name', 'type'])
AA_alleles = pd.DataFrame(columns=['subject', 'chrom', 'pos', 'bp', 'SNPid'])
Aa_alleles = pd.DataFrame(columns=['subject', 'chrom', 'pos', 'bp', 'SNPid'])
aa_alleles = pd.DataFrame(columns=['subject', 'chrom', 'pos', 'bp', 'SNPid'])
  

‘subject’ во всех фреймах данных содержит уникальный идентификатор субъекта. Я хочу найти комбинации всех симптомов и аллелей с количеством субъектов для каждой комбинации, а также столбец для зиготности (AA, Aa или aa для каждого имени df). Например, результаты, которые я ищу, это:

 ['symptom_name', 'symptom_type', 'zygosity', 'chrom', 'pos', 'bp', 'SNPid', 'subject_count']
  

Каков наилучший способ выполнить это преобразование? Для справки, это делается для создания данных, готовых для теста Фримена-Халтона.

Комментарии:

1. Что вы пробовали до сих пор? Кроме того, все subject ли идентификаторы в **_alleles подмножествах идентификаторов в symptoms ?

2. Они будут, хотя я рассматриваю возможность исключения aa_alleles из-за длины запросов, поэтому эти подсчеты будут состоять из общего количества объектов — двух других для анализа. До сих пор я делал **_alleles[‘zygosity’] = ** и как раз собираюсь выполнить внутреннее слияние по теме для каждого **_alleles … Я предполагаю, что это в значительной степени так, тогда мне нужно решить, как уменьшить частоту. В Aa_alleles более 8 миллионов строк, а в aa_allales их будет намного больше, поэтому я не уверен, будет ли более эффективный метод, чем простое добавление, а затем уменьшение.

Ответ №1:

Я думаю, что я это понял:

 AA_alleles['zygosity'] = 'AA'
Aa_alleles['zygosity'] = 'Aa'
aa_alleles['zygosity'] = 'aa'
df = symptoms.merge(AA_alleles, on='subject')
df2 = symptoms.merge(Aa_alleles, on='subject')
df3 = symptoms.merge(aa_alleles, on='subject')
total = df.append(df2, ignore_index=True)
total = total.append(df3, ignore_index=True)
count = total.groupby(['chrom','pos','bp','SNPid','zygosity','name','type']).count()
  

Кажется, это помогает:

 Chromosome_X    2724760     T   rs55842969;rs111382948  Aa  Albumin     high    1
                                                                BMI     high    1
                                                                FEV1    high    1
                                                                        low     1
                                                                FVC     high    1
...     ...     ...     ...     ...     ...     ...     ...
Chromosome_9    141016320   A   rs41290003  Aa  Trunkal Fat Mass    high    1
                                                            Urea    high    1
                                                            VLDL    high    1
                                                            WHR     high    2
                                                            Weight  high    1