我有兩個資料框,df并且df2. 我想在called上添加df一個額外的列。此列應包含基于 df 和 df2 的組名的連接定義的行的名稱,并且滿足此條件時:。dfnamesdfdf2(df[val2] >= df2[val] >= df[val2])
因此,鑒于此輸入:
df
val1 val2 group
0 1 2 a1
1 3 4 a1
2 10 12 a1
3 23 25 a1
4 1 2 a2
5 3 4 a2
6 10 12 a2
7 23 25 a2
df2
val name group
0 1 abc a1
1 4 def a1
2 12 ghi a1
3 26 jkl a1
4 2 p1 a2
5 4 p2 a2
6 12 p3 a2
7 26 p4 a2
所需的輸出將是:
df
val1 val2 group name
0 1 2 a1 abc
1 3 4 a1 def
2 10 12 a1 ghi
3 23 25 a1
4 1 2 a2 p1
5 3 4 a2 p2
6 10 12 a2 p3
7 23 25 a2
如前所述,我設法獲得了正確的結果,但我的代碼根本沒有效率(在這個小例子中,這并不重要,但是當在一個有數千個暫存器的例子上運行這個片段時,你可以看出它是很慢)。有什么辦法可以提升這個操作嗎?PS:下面是我當前的代碼和一個作業示例:
d = {'val1': [1, 3, 10, 23, 1, 3, 10, 23], 'val2': [2, 4, 12, 25, 2, 4, 12, 25], 'group': ["a1", "a1", "a1", "a1", "a2", "a2", "a2", "a2"]}
d2 = {'val': [1, 4, 12, 26, 2, 4, 12, 26], 'name': ['abc', 'def', 'ghi', 'jkl', 'p1', 'p2', 'p3', 'p4'], 'group': ["a1", "a1", "a1", "a1", "a2", "a2", "a2", "a2"]}
df = pd.DataFrame(data=d)
df2 = pd.DataFrame(data=d2)
names = set(df["group"])
df["name"] = ""
for name in names:
df_it = df[df["group"] == name]
df2_it = df2[df2["group"] == name]
for it in df_it.index:
df2_it_2 = df2_it[(df2["val"] >= \
df_it["val1"][it]) &
(df2["val"] <=
df_it["val2"][it])]
if not df2_it_2.empty:
df["name"][it] = df2_it_2["name"].iloc[0]
uj5u.com熱心網友回復:
您可以執行 amerge_asof以使 val ≥ val1,然后屏蔽合并 val 大于 val2 的“名稱”:
(pd.merge_asof(df.reset_index().sort_values(by='val1'),
df2.sort_values(by='val'),
direction='forward',
by='group', left_on='val1', right_on='val')
.set_index('index').sort_index()
.assign(name=lambda d: d['name'].mask(d['val'].gt(d['val2'])))
.drop(columns='val')
)
使用第二個選項的另一個選項join,這對于添加許多列可能更靈活:
cols = ['name']
df.join(
pd.merge_asof(df.reset_index().sort_values(by='val1'),
df2.sort_values(by='val'),
direction='forward',
by='group', left_on='val1', right_on='val')
.loc[lambda d: d['val'].le(d['val2']), ['index'] cols]
.set_index('index')
)
輸出:
val1 val2 group name
index
0 1 2 a1 abc
1 3 4 a1 def
2 10 12 a1 ghi
3 23 25 a1 NaN
4 1 2 a2 p1
5 3 4 a2 p2
6 10 12 a2 p3
7 23 25 a2 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455747.html
