我想將兩個資料框連接在一起以向代碼添加標簽。代碼由字母和數字的組合組成。有沒有辦法一步一步根據字母和數字加入表格?它不一定是原生熊貓。請注意,在字母上加入是不夠的,因為有些字母顯示重疊。最后,我的資料集很大,因此分兩步進行直到現在才起作用(也就是說,首先僅合并字母,然后作為第二步過濾以查看是否適合范圍)。
我創建了一些假資料
def make_df_from_lists(index,**kwargs):
return pd.DataFrame(list(zip(*kwargs.values())),index=index,columns=list(kwargs.keys()))
index = [1,2,3,4,5,6,7,8,9,10]
number = [1,2,3,4,5,6,7,8,9,10]
code= ["A11", "E01", "H95", "B22", "D51", "D11", "C15", "H56", "A15", "E11"]
diags = make_df_from_lists(index,Number= number,Code=code)
index = [1,2,3,4,5,6,7,8]
range = ["A00-B99", "C00-D48", "D50-D90", "E00-E90", "F00-F99", "G00-G99", "H00-H59", "H60-H95"]
label = ["label1", "label2", "label3", "label4", "label5", "label6", "label7", "label8"]
labels = make_df_from_lists(index,Range=range,Label=label)
想要的結果:
Number Diag Label
1 A11 label1
2 E01 label4
3 H95 label8
4 B22 label1
5 D51 label3
6 D11 label2
7 C15 label2
8 H56 label7
9 A15 label1
10 E11 label4
感謝https://www.jcchouinard.com/generate-dummy-data-with-python/獲得構建假資料集的靈感。
uj5u.com熱心網友回復:
您基本上可以用字母表中相應的位置索引替換每個字母:
即A是 1,B是 2,依此類推。
這樣,仍然保留范圍:
A00-B99 becomes 100-299
C00-D48 becomes 300-448
.
.
H00-H59 becomes 800-859
H60-H95 becomes 860-895
代碼也是如此:
A11 becomes 111 ...
然后,您可以利用merge_asof操作,該操作執行以下操作:
這類似于左連接,除了我們匹配最近的鍵而不是相等的鍵。兩個 DataFrame 都必須按 key 排序。
也就是說,由于范圍是排序的,我們實際上可以在范圍的最低(或最高)值上合并新的數字代碼。
考慮每個(數字)范圍的最小值:100、300 ... 800、869。現在,如果我們想將 A11(現在是 111)匹配到它最近的低閾值,我們會得到 100。
代碼:
- 將范圍和代碼轉換為數字:
from ascii import ascii_uppercase
letters_ordinal = {letter: str(index) for index, letter in enumerate(ascii_uppercase, start=1)}
# 'A': '1',
# 'B': '2',
# 'C': '3',
# ...
- 替換我們的兩個資料框:
labels['numerical_range'] = labels['Range'].replace(letters_ordinal, regex=True)
diags['numerical_code'] = diags['Code'].replace(letters_ordinal, regex=True).astype('int')
- 拆分范圍的字串表示以獲得 a
low和high閾值:
labels[['low', 'high']] = labels['numerical_range'].str.split('-', expand=True).astype('int')
- 合并排序的鍵:
diags = diags.sort_values(by='numerical_code')
output = pd.merge_asof(
diags,
labels[["low", "Label"]],
left_on="numerical_code",
right_on="low"
).drop(["low", 'numerical_code'], axis=1).sort_values(by='Number')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519905.html
上一篇:如何(動態)將陣列與結構連接,以從結構中獲取陣列中每個元素的值?
下一篇:回傳串列中平均評分最高的類別名稱
