![](/img/trans.png)
[英]Pandas filtering rows in one dataframe based on values in another data frame
[英]Pandas Filtering one dataframe if a value is between two values from another data frame
我有兩個數據框如下:
df1
chr_number start end strand
0 chr1 111478338 111478339 +
1 chr1 111478370 111478371 +
2 chr1 111478372 111478373 +
3 chr1 157123306 157123307 -
4 chr1 157123307 157123308 -
5 chr1 212619741 212619742 +
6 chr1 212619742 212619743 +
df2
Chromosome Start End Log2 Fold Change Strand Gene \
0 chr1 111478330 111478444 3.036912 + C1orf162
1 chr1 157123300 157123338 3.293174 - ETV3
2 chr1 207079296 207079412 3.916122 + PFKFB2
3 chr1 212619736 212619771 3.880546 + ATF3
Ensembl ID Feature
0 ENSG00000143110.11 3' UTR
1 ENSG00000117036.12 3' UTR
2 ENSG00000123836.15 3' UTR
3 ENSG00000162772.17 3' UTR
我需要查看從 df1 開始是否位於 df2 中的開始和結束之間。 如果是這樣,我想要一個新的數據框,其中包含 df1 的起始值和 df2 中的相應行。
以下是我需要 df1 中每個起始值的示例:
CrossLink Chromosome Start End Log2 Fold Change Strand \
1 111478338 chr1 111478330.0 111478444.0 3.036912 +
Gene Ensembl ID Feature
1 C1orf162 ENSG00000143110.11 3' UTR
我寫了這段代碼:
df3 = pd.DataFrame([])
df3["CrossLink"] = np.nan
for v in df1["start"]:
df4 = df2[(df2["Start"] <= v) & (df2["End"] > v)]
df3 = df3.append(df4)
df3["CrossLink"] = df1["start"]
我得到這個 output:
CrossLink Chromosome Start End Log2 Fold Change Strand \
0 111478338 chr1 111478330.0 111478444.0 3.036912 +
0 111478338 chr1 111478330.0 111478444.0 3.036912 +
0 111478338 chr1 111478330.0 111478444.0 3.036912 +
1 111478370 chr1 157123300.0 157123338.0 3.293174 -
1 111478370 chr1 157123300.0 157123338.0 3.293174 -
3 157123306 chr1 212619736.0 212619771.0 3.880546 +
3 157123306 chr1 212619736.0 212619771.0 3.880546 +
Gene Ensembl ID Feature
0 C1orf162 ENSG00000143110.11 3' UTR
0 C1orf162 ENSG00000143110.11 3' UTR
0 C1orf162 ENSG00000143110.11 3' UTR
1 ETV3 ENSG00000117036.12 3' UTR
1 ETV3 ENSG00000117036.12 3' UTR
3 ATF3 ENSG00000162772.17 3' UTR
3 ATF3 ENSG00000162772.17 3' UTR
它不包含我從 df1 開始的所有值,它給了我重復項。 我在 python 和 pandas 很新,我搜索了很多但我無法弄清楚。
非常感謝您的幫助!
使用兩步過程的解決方案:
假設我們有
df = pd.DataFrame({'chr_number':['chr1', 'chr2'], 'start':[3, 5],})
df2 = pd.DataFrame({'index': ['chr1', 'chr3'], 'col': ['a', 'b'], 'start': [1, 2], 'end':[4, 5]})
print(df)
print(df2)
chr_number start
0 chr1 3
1 chr2 5
index col start end
0 chr1 a 1 4
1 chr3 b 2 5
然后我們可以應用聚合和分解以獲得所需的 output。
df2.start = df2.apply(lambda x: df.loc[(x['start'] <= df.start) & (df.start <= x['end'])].start.agg(list), axis=1)
print(df2.explode('start'))
index col start end
0 chr1 a 3 4
1 chr3 b 3 5
1 chr3 b 5 5
編輯:我意識到我在比較df2
值而不是df
時做的操作不正確。 編輯后的代碼現在將df2.start
替換為df2
行的df2.start
和df2.end
之間的所有df.start
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.