import pandas as pd
data = {'Region': ['A', 'A', 'B', 'B', 'C', 'C'],
'Description': ['D1', 'D2', 'D1', 'D2', 'D1', 'D2'],
'Baseline 1':[1,2,3,4,5,6]
:
'Baseline N': [some numbers]
'Regime 1': [0,0,0,0,2,3]
:
'Regime N': [some numbers]
}
df1 = pd.DataFrame(data)
replace_data = {'Region':['A','B','C'],
'Values':[6,7,8]}
df2 = pd.DataFrame(replace_data)
我有一個以'Region'為索引的資料框,需要用'replace_data'資料框值替換所有描述為'D2'和**Regime 1到N有0 **(任何像列有0的區域)的區域的特定區域。
因此,上述代碼示例中的方法 1 的最終值應為 [0,6,0,7,2,3](注意 0 被區域 A 和 B 的 replace_data 幀中的 6 和 7 替換)。對于每個政權列,都需要這樣做。其余列(如基線)應保持原樣。
我可以為列和替換等所有機制運行一個回圈,但我覺得這將非常低效且耗時,因為我有 20 多個這樣的列并且需要多次執行類似的操作。有什么有效的方法來做到這一點?
df.loc[((df['Description']=='D2'),regime_all_cols].replace({0:df2['Values'].values[0]})
當我只有一個區域但有多個區域時,這曾經可以正常作業。
uj5u.com熱心網友回復:
您可以嘗試對 DataFrame 的部分進行切片以替換并用填充版本的 DataFrame 替換它
cols = df1.filter(like='Regime').columns.to_list()
d = dict(zip(replace_data['Region'], replace_data['Values']))
repl_df = df1.mask(df1.eq(0)).T.fillna(df1['Region'].map(d)).T
df1.loc[df1['Description'].eq('D2'), cols] = repl_df
替代回圈:
mask = df1['Description'].eq('D2')
d = dict(zip(replace_data['Region'], replace_data['Values']))
repl = df1['Region'].map(d)
for c in df1.filter(like='Regime'):
S = df1.loc[mask, c]
df1.loc[mask, c] = S.mask(S.eq(0)).fillna(repl)
輸出:
Region Description Baseline 1 Baseline N Regime 1 Regime N
0 A D1 1 9 0 9
1 A D2 2 9 6 9
2 B D1 3 9 0 9
3 B D2 4 9 7 9
4 C D1 5 9 2 9
5 C D2 6 9 3.0 9
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/447947.html
