首页 > 解决方案 > 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有 stringXYZSelect2有 string YYY

在哪里,在第二行

1018.041022.81(列Mid_XYZMid_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'),但我怎么能按行做呢?

标签: pythonpandasdataframe

解决方案


使用以下矢量化解决方案:

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

推荐阅读