python - 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.11
and 1027.64
(column Mid_XYZ
and 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
推荐阅读
- javascript - 如何从画布上删除前一帧的矩形?
- ruby-on-rails - Rails 有很多通过关联 - 使用包含
- javascript - $(this).position 和 getBoundingClientRect() 之间的区别
- python - Python 3 - 在不调用 __getattr__ 的情况下检查类属性
- python - scikit-learn fit() 会修改原始数据吗?
- javascript - 如何将数据从 Vue 实例传递到单个文件组件
- c# - C# 将 ENTER 编程到文档中
- java - bean初始化失败;嵌套异常是 java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting ')'
- react-native - 如何使用 expo react native 预加载视频
- android - 更正数据以以编程方式插入联系人