我有两个数据帧。我想基于将新列与另一列进行比较来创建一个新列。
我是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中做类似的事情。我还没有找到解决方案。
答案 0 :(得分:0)
由于你有800K行的数据,我不知道这是多么优化,但你可以:
loc
过滤合并后的dataframe
?df = Mapfile.merge(Armsfile)
df.loc[(df['Position'] > df['Start']) & (df['Position'] <= df['End'])].drop(['Start', 'End'], axis=1)
注意:我不确定如何处理Armsfile
Chr
,因为您的Mapfile
和Armsfile
在您的示例中的Chr
都为$('#radios-1').next().text('BAR');
//OR
$('#radios-1').next('span').text('BAR');
。