разбить группы в таблице на таблицы ее подгрупп - PullRequest
0 голосов
/ 18 июня 2019

У меня есть таблица, которая уже сгруппирована по первому столбцу. Я хотел бы разбить таблицу на вложенные таблицы только с соответствующим вторым столбцом. Я хотел бы использовать панд или что-то еще в Python. Я не заинтересован в использовании «awk», потому что это потребует от меня «subprocess» или «os». В конце концов, мне нужны только записи во втором столбце, разделенные в соответствии с первым. Размер таблицы может составлять около 10000 строк по 6 столбцов.

Это похожие посты, которые я нашел, но я не мог понять, как изменить их для моих целей. Фрейм данных разделенных панд по группам

Разделение groupby () в пандах на более мелкие группы и объединение их

Таблица / фрейм данных, который у меня есть, выглядит следующим образом:

P0A910  sp|A0A2C5WRC3|  84.136  0.0        100
P0A910  sp|A0A068Z9R6|  73.816  0.0         99
Q9HVD1  sp|A0A2G2MK84|  37.288  4.03e-34    99
Q9HVD1  sp|A0A1H2GM32|  40.571  6.86e-32    98
P09169  sp|A0A379DR81|  52.848  2.92e-117   99
P09169  sp|A0A127L436|  49.524  2.15e-108   98

И я бы хотел, чтобы он был разбит следующим образом

group1:

P0A910  A0A2C5WRC3
P0A910  A0A068Z9R6

group2:

Q9HVD1  A0A2G2MK84
Q9HVD1  A0A1H2GM32

group3:

P09169  A0A379DR81
P09169  A0A127L436

ИЛИ в списки

P0A910:

A0A2C5WRC3
A0A068Z9R6

Q9HVD1:

A0A2G2MK84
A0A1H2GM32

P09169:

A0A379DR81
A0A127L436

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Так что мне удалось получить какое-то решение. В этом решении мне удалось удалить префиксы во втором и использовать groupby в pandas для группировки записей по первому столбцу. Затем перебрал его и записал каждую группу отдельно в CSV-файлы. Я получил помощь от ответа @Quang и этой ссылки . Возможно, это можно сделать и лучше, но вот мой код:

import pandas as pd

#read .csv as dataframe
data=pd.read_csv("BlastOut.csv")

#truncates sp| | from second column (['B']).
new_col=data['B'].str[3:-1]

#replaces second column with new_col
data['B']=new_col.to_frame(name=None) 

#groups dataframe by first column (['A'])
grouped=data.groupby('A')             

#loops through grouped items and writes each group to .csv file with title 
#of group ([group_name].csv)
for group_name, group in grouped:
    group.to_csv('Out_{}.csv'.format(group_name))  

Обновление - удалены все столбцы, кроме интересующего столбца. Это продолжение предыдущего кода

import glob

#reads all csv files starting with "Out_" in filename
files=glob.glob("Out_*.csv")

#loop through all csv files 
for f in files:
     df=pd.read_csv(f, index_col=0)

     # Drop columns by column title (["A"])
     df.drop(["A"], axis=1, inplace=True)

     df.to_csv(f,index=False)
0 голосов
/ 18 июня 2019

Итак, ваша проблема - разделить строки. Это то, что вы хотите:

new_col = df[1].str[3:-1]
list(new_col.groupby(df[0]))
...