【问题标题】:merging in pandas vs merging in R在 Pandas 中合并与在 R 中合并
【发布时间】:2014-05-05 12:15:59
【问题描述】:

恐怕我不太了解 pandas 的合并功能,虽然我现在更喜欢 python 而不是 R。

在 R 中,我一直能够非常轻松地合并数据帧,如下所示:

> merge(test,e2s, all.x=T)
      Gene                 Mutation Chromosome Entrez
1     AGRN                  p.R451H       chr1 375790
2 C1orf170            p.V663A/V683A       chr1  84808
3     HES4                   p.R44S       chr1  57801
4    ISG15                   p.S83N       chr1   9636
5  PLEKHN1 p.S476P/S511P/S563P/S76P       chr1  84069

但是,我无法在 pandas 中使用 merge(how="left,right,inner,outer") 重建它。例如:

Outer yields a union, which makes sense:
x = test.merge(e2s, how="outer")
In [133]: x.shape
Out[133]: (46271, 4)

但即使Entrez_Gene_Id 已成功合并,内部也会产生一个空数据框:

In [143]: x = test.merge(e2s, how="inner")

In [144]: x
Out[144]:
Empty DataFrame
Columns: [Gene, Mutation, Chromosome, Entrez_Gene_Id]
Index: []

[0 rows x 4 columns]

交叉点应包含一行gene : HES4。我需要为此打开某种字符串匹配吗?:

e2s:

57794   SUGP1
57795   BRINP2
57796   DKFZP761C1711
57798   GATAD1
57799   RAB40C
57801   HES4
57804   POLD4
57805   CCAR2
57817   HAMP

测试:

       Gene                  Mutation Chromosome
0   PLEKHN1  p.S476P/S511P/S563P/S76P       chr1
1  C1orf170             p.V663A/V683A       chr1
2      HES4                    p.R44S       chr1
3     ISG15                    p.S83N       chr1
4      AGRN                   p.R451H       chr1
5    RNF223                   p.P242H       chr1

更新:

据我所知,列被标记以便它们可以正常合并,我只想按Gene 列合并并保留所有测试行:

In [148]: e2s.columns
Out[148]: Index([u'Gene', u'Entrez_Gene_Id'], dtype='object')

In [149]: test.columns
Out[149]: Index([u'Gene', u'Mutation', u'Chromosome'], dtype='object')

这是通过显式重命名数据框来完成的:

e2s.rename(columns={"Gene":u'Gene',"Entrez_Gene_Id":u'Entrez_Gene_Id'}, inplace=True)

听写:

{u'Chromosome': {0: u'chr1',
  1: u'chr1',
  2: u'chr1',
  3: u'chr1',
  4: u'chr1',
  5: u'chr1'},
 u'Gene': {0: u'PLEKHN1',
  1: u'C1orf170',
  2: u'HES4',
  3: u'ISG15',
  4: u'AGRN',
  5: u'RNF223'},
 u'Mutation': {0: u'p.S476P/S511P/S563P/S76P',
  1: u'p.V663A/V683A',
  2: u'p.R44S',
  3: u'p.S83N',
  4: u'p.R451H',
  5: u'p.P242H'}}

{u'Entrez_Gene_Id': {14118: u'SUGP1',
  14119: u'BRINP2',
  14120: u'DKFZP761C1711',
  14121: u'GATAD1',
  14122: u'RAB40C',
  14123: u'HES4',
  14124: u'POLD4',
  14125: u'CCAR2',
  14126: u'HAMP'},
 u'Gene': {14118: 57794,
  14119: 57795,
  14120: 57796,
  14121: 57798,
  14122: 57799,
  14123: 57801,
  14124: 57804,
  14125: 57805,
  14126: 57817}}

【问题讨论】:

  • 这里有一些比较:wesmckinney.com/blog/?p=395
  • 正如另一条评论中提到的:这不是编码问题,问题是列名在 e2s 中不正确/切换,因此没有匹配项。通过切换回e2s.columns = e2s.columns[::-1]解决。

标签: python r join merge pandas


【解决方案1】:

也许您没有标记列(这是必需的,否则您怎么知道要使用哪些列来匹配!)

如果它们都是带有标签列的框架,则效果很好:

In [11]: e2s
Out[11]: 
   number           Gene
0   57794          SUGP1
1   57795         BRINP2
2   57796  DKFZP761C1711
3   57798         GATAD1
4   57799         RAB40C
5   57801           HES4
6   57804          POLD4
7   57805          CCAR2
8   57817           HAMP

In [12]: test
Out[12]: 
       Gene                  Mutation Chromosome
0   PLEKHN1  p.S476P/S511P/S563P/S76P       chr1
1  C1orf170             p.V663A/V683A       chr1
2      HES4                    p.R44S       chr1
3     ISG15                    p.S83N       chr1
4      AGRN                   p.R451H       chr1
5    RNF223                   p.P242H       chr1

In [13]: e2s.merge(test)
Out[13]: 
   number  Gene Mutation Chromosome
0   57801  HES4   p.R44S       chr1

In [14]: test.merge(e2s)
Out[14]: 
   Gene Mutation Chromosome  number
0  HES4   p.R44S       chr1   57801

【讨论】:

  • 我相信我已经正确命名了这些列。尝试重命名它们,但没有成功合并。感谢您的回复,虽然这令人困惑:)
  • @lennart 你能把这两个对象的 .to_dict() 的输出都包含进去,这样我们就可以复制了!
  • 嘿,安迪,join 在这种情况下更合适吗?
  • @PaulH 这是一个很好的问题,我认为这真的很重要(bost fast)并且取决于以后它是否有助于使用 Gene 作为索引:s
  • @lennart 是的,这很愚蠢! (列的标签不同:Gene 是数字,Entrez_Gene_Id 是名称!因此没有匹配项)也许用e2s.columns = e2s.columns[::-1] 切换它们。
猜你喜欢
  • 2019-07-26
  • 2018-03-30
  • 2022-01-20
  • 2020-02-14
  • 2015-10-31
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多