python新列基于与另一个datafram的比较

2024-06-16 12:21:46 发布

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

我有两个数据帧。我想在一个列中创建一个新列,并将其与另一个进行比较。在

我对Python不熟悉,但这里有我用R编写的解决方案,它很有用,但又可怕又缓慢。我一直在努力寻找一种更好的方法。在

映射文件(有大约800000行)

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

Armsfile(有39行)

^{pr2}$

R脚本:

^{3}$

输出表:

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

大写: 我希望每一行都查找位置(1)找到右边的Chr,2)找到START < POSITION < END的行,然后得到ARM信息并将其放入一个新的列中。在

我试着为Python重新格式化我的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中做类似的事情。我还没有找到解决办法。在


Tags: names3linepositionstartarmendrow
1条回答
网友
1楼 · 发布于 2024-06-16 12:21:46

由于您有许多800K行的数据,我不知道这有多好,但您能:

  1. 合并
  2. 使用loc过滤合并的dataframe?在

df = Mapfile.merge(Armsfile)
df.loc[(df['Position'] > df['Start']) & (df['Position'] <= df['End'])].drop(['Start', 'End'], axis=1)

注意:我不确定如何处理ArmsfileChr,因为您的Mapfile和{}在您的示例中都有Chr的值。在

相关问题 更多 >