我有一个制表符分隔的文本文件,例如这个小例子:
small example
:
chr15 60644581 60644675 ANXA2 ENST00000332680.4 annotated
chr15 60643922 60644018 ANXA2 ENST00000332680.4 annotated
chr15 60643391 60643450 ANXA2 ENST00000332680.4 annotated
chr15 60641273 60641396 ANXA2 ENST00000332680.4 annotated
chr15 60639831 60639888 ANXA2 ENST00000332680.4 annotated
chr14 25443870 25444024 STXBP6 ENST00000550887.1 annotated
chr14 25326232 25326363 STXBP6 ENST00000550887.1 annotated
chr14 25325141 25325307 STXBP6 ENST00000550887.1 annotated
chr14 25288242 25288400 STXBP6 ENST00000550887.1 annotated
我想制作另一个制表符分隔的文件,该文件具有6列但行较少。实际上,我想对行进行汇总。具有相同第4列的行必须汇总为一行,实际上首先我需要根据第4列对行进行分组。新行具有相同的第一,第四,第五和第六列,但第二列来自每个组的第一行,第三列来自每个组的最后一行。在小示例中,我们基于第4列有2个组,因此对于第一个组,我们将有以下行:
chr15 60644581 60639888 ANXA2 ENST00000332680.4 annotated
,小示例的预期输出将如下所示:
expected output
:
chr15 60644581 60639888 ANXA2 ENST00000332680.4 annotated
chr14 25443870 25288400 STXBP6 ENST00000550887.1 annotated
我正在尝试使用以下命令在python中执行此操作,但它不会返回预期的输出。你知道如何解决吗?
import pandas as pd
p = pd.read_csv("myfile.txt", sep='\t')
data = p.groupby('4th column')
mylist = []
for i in range(len(data)):
new_line = 'data[0], data[1], data[2], data[3], data[4], data[5]'
mylist.append(new_line)
df = pd.DataFrame(mylist)
df.to_csv('outfile.txt', sep='\t', index=None, header=False)
答案 0 :(得分:0)
您没有指定第1列,第5列和第6列的分组值应该是什么,因此我假设任何值都可以,并且将与第2列一样使用 first 。
您要查找的是 groupby 之后的汇总,该汇总将提供适当的值。将{列名称:聚合函数名称}对的字典传递给 agg ,尤其是{**"2": "first"**, **"3": "last"**}
。
import pandas as pd
p = pd.read_csv("myfile.txt", names=["1", "2", "3", "4", "5", "6"], header=None, sep='\t')
df = p.groupby("4").agg({"1": "first", "2": "first", "3": "last", "5": "first", "6": "first"})
df.reset_index(inplace=True)
df = df.reindex(sorted(df.columns), axis=1)
df.to_csv('outfile.txt', sep='\t', index=False, header=None)