Pandas-根据其他列的值从特定列中选择行值
这有点令人费解,但我只会显示我的数据
我构建了以下数据框:
Mid_XYZ Mid_YYY Mid_ZZZ Select1 Select2
867 1019.11 1027.64 1022.68 XYZ YYY
873 1018.04 1027.58 1022.81 XYZ ZZZ
我想通过匹配列名的一部分来从基于Select1和Select2字符串的列中选择值。在第一行,这将是
1019.11and 1027.64(column Mid_XYZand Mid_YYY) - 因为Select1有 stringXYZ并且Select2有 string YYY。
其中,在第二行
1018.04和1022.81(列Mid_XYZ和Mid_ZZZ)
稍后,我计划将这些值的总和存储在新列中。DataFrame 看起来像这样
Mid_XYZ Mid_YYY Mid_ZZZ Select1 Select2 Sum
867 1019.11 1027.64 1022.68 XYZ YYY 2046.75
873 1018.04 1027.58 1022.81 XYZ ZZZ 2040.85
我可以将列名更改为精确匹配,但应该有一些正则表达式的解决方案?我知道df.filter(regex='XYZ'),但我怎么能按行做呢?
回答
使用以下矢量化解决方案:
import numpy as np
# clean rows
clean = df.columns.str.replace('^Mid_', '', regex=True)
# find matching column indices
s1 = np.argmax(clean.values == df['Select1'].values[:, None], axis=1)
s2 = np.argmax(clean.values == df['Select2'].values[:, None], axis=1)
# index and sum
df['Sum'] = df.values[np.arange(len(s1)), s1] + df.values[np.arange(len(s2)), s2]
print(df)
输出
Mid_XYZ Mid_YYY Mid_ZZZ Select1 Select2 Sum
867 1019.11 1027.64 1022.68 XYZ YYY 2046.75
873 1018.04 1027.58 1022.81 XYZ ZZZ 2040.85