在pandas中用一列和公共索引合并两个以上的文件

2024-06-16 10:51:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有10个两列的.csv文件。例如

文件1.csv

Bact1,[1821932:1822487](+)
Bact2,[555760:556294](+)
Bact3,[2901866:2902424](-)
Bact4,[1104980:1105544](+)

文件2.csv

^{pr2}$

文件3.csv

Bact6,[4045708:4047781](+)

依此类推到file10.csv,Bact1代表一种细菌,所有的数字包括符号都代表一个基因的位置。每个文件代表一个不同的基因,并且有重复的,就像file2.csv一样

我想合并这些文件,这样我就有了这样的东西

Bact1    [1821932:1822487](+)    [1973928:1975194](-)    NaN
Bact2    [555760:556294](+)      [972152:973499](+)      NaN
Bact3    [2901866:2902424](-)    [3001035:3002739](-)    NaN
Bact4    [1104980:1105544](+)    [3331158:3332481](+)    NaN
Bact5    NaN                     [712517:713771](+)      NaN     
Bact5    NaN                        [1376120:1377386](-)    NaN
Bact6    NaN                     NaN                     [4045708:4047781](+)

我曾尝试在python中使用pandas包,但似乎大多数函数都是为了合并两个数据帧,而不是两个以上,或者我遗漏了一些东西。在

我上周刚开始用python编程(我通常使用R),所以陷入可能或至少是这样的事情看起来很简单。在

现在我正在使用:

    for x in range(1,10):
        df[x]=pandas.read_csv("file%s.csv" % (x),header=None,index_col=[0])
        df[x].columns=['gene%s' % (x)]
   dfjoin={}
   dfjoin=df[1].join([df[2],df[3],df[4],df[5],df[6],df[7],df[8],df[9],df[10]])

结果:

0                          gene1           gene2             gene3                 
Starkeya-novella-DSM-506     NaN     [728886:730173](+)  [731445:732615](+)     
Starkeya-novella-DSM-506     NaN     [728886:730173](+)  [9662:10994](+)    
Starkeya-novella-DSM-506     NaN     [728886:730173](+)  [9662:10994](+)     
Starkeya-novella-DSM-506     NaN     [728886:730173](+)  [9662:10994](+) 

见gene2和gene3,它复制了重复的结果。在


Tags: 文件csvdf基因代表nandsmbact2
2条回答

我稍微改变了你的示例数据,代码如下:

import pandas as pd
import io

data = {
"file1":"""Bact1,[1821932:1822487](+)
Bact2,[555760:556294](+)
Bact3,[2901866:2902424](-)
Bact4,[1104980:1105544](+)
Bact5,[1104981:1105544](+)
Bact5,[1104982:1105544](+)""",

"file2":"""Bact1,[1973928:1975194](-)
Bact2,[972152:973499](+)
Bact3,[3001035:3002739](-)
Bact4,[3331158:3332481](+)
Bact5,[712517:713771](+)
Bact5,[1376120:1377386](-)
Bact5,[1376121:1377386](-)""",

"file3":"""Bact4,[3331150:3332481](+)
Bact6,[4045708:4047781](+)"""}

def read_file(f):
    s = pd.read_csv(f, header=None, index_col=0, squeeze=True)
    return s.groupby(s.index).apply(lambda s:pd.Series(s.values))

series = {key:read_file(io.StringIO(unicode(text)))
          for key, text in data.items()}

print pd.concat(series, axis=1)

输出:

^{pr2}$

假设您已将这些作为数据帧读入,如下所示:

In [11]: df1 = pd.read_csv('file1.csv', sep=',', header=None, index_col=[0], names=['bact', 'file1'])

In [12]: df1
Out[12]: 
                      file1
bact
Bact1  [1821932:1822487](+)
Bact2    [555760:556294](+)
Bact3  [2901866:2902424](-)
Bact4  [1104980:1105544](+)

然后您可以简单地^{}它们:

^{pr2}$

相关问题 更多 >