我有一個df,我想在其中添加一個自定義的標量,這個標量在查詢資料框中。因此,對于每條有chr1的記錄,我想添加0,對于每條有chr2的記錄,我想添加248956422,等等。
lookup = pd.DataFrame(
[
["chr1"/span>, 0.0]。
["chr2", "248956422.0"] 。
["chr3", "491149951.0"] 。
],
columns=["chromosome", "position"])
df = pd.DataFrame([
["chr1", 50001] 。
["chr1", 150001] 。
["chr1", 250001] 。
["chr2", 50001]。
["chr2", 350001] 。
["chr3", 10000] 。
["chr3", 110000]。
], columns=["chrom", "midpoint"])
最終的輸出應該是這樣的:
pd.DataFrame([
["chr1"/span>, 50001]。
["chr1", 150001] 。
["chr1", 250001] 。
["chr2", 249006423]。
["chr2", 249306423] 。
["chr3", 491159951] 。
["chr3", 491259951]。
], columns=["chrom", "midpoint"])
我可以在一個應用函式中進行,并回圈瀏覽每一行,但這似乎效率不高。有沒有一種方法可以將其矢量化并有效地完成呢?
uj5u.com熱心網友回復:
使用Series.map由Series并添加到原列midpoint:
s = df.set_index('chromosome') ['position']
df2['midpoint'] = df2['chrom'] 。 map(s).astype(float) .astype(int)
print (df2)
鉻中點
0 chr1 50001
1 chr1 150001
2 chr1 250001
3 chr2 249006423
4 chr2 249306423
5 chr3 491159951
6 chr3 491259951
如果可能有些值不匹配,例如chr4:
df2 = pd.DataFrame([
["chr1", 50001] 。
["chr1", 150001] 。
["chr1", 250001] 。
["chr2", 50001] 。
["chr2", 350001] 。
["chr3", 10000] 。
["chr4", 110000] 。
], columns=["chrom", "midpoint"])
s = df.set_index('chromosome') ['position']
df2['midpoint'] = df2['chrom'].map(s)。 fillna(0).astype(float).astype(int)
print (df2)
鉻中點
0 chr1 50001
1 chr1 150001
2 chr1 250001
3 chr2 249006423
4 chr2 249306423
5 chr3 491159951
6 chr4 110000
uj5u.com熱心網友回復:
或者用一行字:
df2.set_index('chrom').add(df. set_index('chromosome').reindex(df2['chrom']).to_numpy().astype(float) .reset_index()
chrom midpoint
0 chr1 50001.0
1 chr1 150001.0
2 chr1 250001.0
3 chr2 249006423.0
4 chr2 249306423.0
5 chr3 491159951.0
6 chr3 491259951.0
只需將df的索引設定為chrom,并將其重新索引為df2['chrom'],然后將相應的索引值加在一起。
如果有一些可能不匹配,請做:
如果有一些可能不匹配,請做:
df2.set_index('chrom').add(df.set_index('romosome')。 reindex(df2['chrom']).fillna(0).to_numpy().astype(float) ).reset_index()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332433.html
標籤:
上一篇:合并兩個資料幀,同時向前尋找
