簡體   English   中英

python-基於與另一個數據框的比較的新列

[英]python - New column based on comparison with another dataframe

我有兩個數據框。 我想根據與另一列的比較在其中創建一個新列。

我是Python的新手,但這是我在R中的解決方案,它雖然有效,但又恐怖又緩慢。 我想找到一種更快的方法,並且我一直在拼命嘗試學習使用pandas因為這似乎是一種好方法。

映射文件(約有80萬行)

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信息並將其放在新列中。

我嘗試只為Python重新格式化R腳本,但語法不正確。 我也嘗試對pandas使用merge ,但是找不到進行數學比較的方法。

為了完整起見,以下是我剛才提到的錯誤嘗試:

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中執行類似的操作。 我尚未找到解決方案。

由於您有80萬行數據,因此我不知道這樣做有多理想,但是您可以:

  1. 合並
  2. 使用loc過濾合並的dataframe

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

注意:我不確定如何處理Armsfile Chr因為在您的示例中MapfileArmsfile Chr均為1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM