我有下一个 pandas dataframe:
x_1 x_2 x_3 x_4 col_to_replace cor_factor
1 2 3 4 x_2 1
3 3 5 1 x_1 6
2 2 0 0 x_3 0
...
我想用 cor_factor
中的值更新保存在 col_to_replace
中的名称列,并将结果保存在相应的列以及 car_factor
列中。
一些(丑陋的)解决方案可能是:
for i in len(df.shape[0]):
df[df['col_to_replace']].iloc[i] = df[df['col_to_replace']].iloc[i] - df['cor_factor'].iloc[i]
df['cor_factor'].iloc[i] = df['cor_factor'].iloc[i] - df[df['col_to_replace']].iloc[i]
这种方式绝对不省时。我正在寻找更快的解决方案。
df 的输出应该是这样的:
x_1 x_2 x_3 x_4 col_to_replace cor_factor
1 1 3 4 x_2 -1
-3 3 5 1 x_1 3
2 2 0 0 x_3 0
...
正确答案
使用 pivot
更正 x_
值和索引查找更正最后一列。由于值发生变化,请确保在修改之前进行复制:
# perform indexing lookup
# save the value for later
idx, cols = pd.factorize(df['col_to_replace'])
corr = df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]
# pivot and subtract the factor
# ensure original order of the columns
cols = df.columns.intersection(cols, sort=false)
df[cols] = df[cols].sub(df.pivot(columns='col_to_replace',
values='cor_factor'),
fill_value=0).convert_dtypes()
# correct with the saved "corr"
df['cor_factor'] -= corr
输出:
x_1 x_2 x_3 x_4 col_to_replace cor_factor
0 1 1 3 4 x_2 -1
1 -3 3 5 1 x_1 3
2 2 2 0 0 x_3 0