python - 基于与另一个数据帧进行比较的新列

时间:2016-01-28 21:26:07

标签: python pandas

我有两个数据帧。我想基于将新列与另一列进行比较来创建一个新列。

我是Python的新手,但这里是我在R中的解决方案,它的工作方式却很可怕而且很慢。我想找到一种更快的方法,而且我一直在拼命学习使用pandas,因为这似乎是一种很好的方法。

Mapfile(有~800,000行)

Name    Chr   Position
S1      1      3000
S2      1      6000
S3      1      1000

Armsfile(有39行)

Chr    Arm    Start   End
1      p      0       5000
1      q      5001    10000

R脚本:

for (line in 1:nrow(mapfile)){
      mapfile$Arm[line] <- Armsfile$Arm[mapfile$Chr[line] == Armsfile$Chr &  mapfile$Position[line] > Armsfile$Start &  mapfile$Position[line] < Armsfile$End]
      }

输出表:

Name   Chr   Position   Arm
S1      1     3000      p
S2      1     6000      q
S3      1     1000      p

用语言说: 我希望每一行都能查找位置(1)找到正确的Chr,2)找到START < POSITION < END所在的行,然后获取ARM信息并将其放入新的位置列。

我尝试重新格式化我的R R脚本,但无法正确使用语法。我也尝试将merge用于pandas,但无法找到进行数学比较的方法。

为了完整起见,这是我刚刚提到的不良尝试:

for line in 1:mapfile.shape[0]:
      mapfile$Arm[line] = Armsfile$Arm[   mapfile$Chr[line] == Armsfile$Chr &&  mapfile$Position[line] > Armsfile$Start &&  mapfile$Position[line] < Armsfile$End]

df = pd.merge(mapfile, Armsfile, on=['Chr', mapfile.Position > Armsfile.Start, mapfile.Position < Armsfile.End])

编辑:另一种可能的思考方式

我一直在研究R中的另一种可能性,它可能会以某种方式转换为Python。这是R代码:

mapfile <- data.frame(Name = c("S1", "S2", "S3"), Chr = 1, Position = c(3000, 6000, 1000), key = "Chr")
Chr.Arms <- data.frame(Chr = 1, Arm = c("p", "q"), Start = c(0, 5001), End = c(5000, 10000), key = "Chr")
mapfile$Arm <- c("N")
> mapfile
   Name Chr Position Arm
1:   S1   1     3000   N
2:   S2   1     6000   N
3:   S3   1     1000   N

for(i in 1:nrow(Chr.Arms)){
   cur.row <- Chr.Arms[i,]
   mapfile$Arm[mapfile$Chr == cur.row$Chr & mapfile$Position >= cur.row$Start & mapfile$Position <= cur.row$End] <- Chr.Arms$Arm
   }

> mapfile
   Name Chr Position Arm
1:   S1   1     3000   p
2:   S2   1     6000   p
3:   S3   1     1000   q

但同样,有了如此庞大的数据,我希望能够在Python中做类似的事情。我还没有找到解决方案。

1 个答案:

答案 0 :(得分:0)

由于你有800K行的数据,我不知道这是多么优化,但你可以:

  1. 合并
  2. 使用loc过滤合并后的dataframe
  3. df = Mapfile.merge(Armsfile)
    df.loc[(df['Position'] > df['Start']) & (df['Position'] <= df['End'])].drop(['Start', 'End'], axis=1)
    

    注意:我不确定如何处理Armsfile Chr,因为您的MapfileArmsfile在您的示例中的Chr都为$('#radios-1').next().text('BAR'); //OR $('#radios-1').next('span').text('BAR');