如何为DataFrame新增列,基于其他列的行统计值计算?
解决方法:给DataFrame按行规则新增计算列
嘿,这个需求不用单独创建额外数据集就能搞定,我给你两种实用的实现方式,都是直接在原DataFrame上操作:
方法1:行标签映射 + apply函数
这种方法适合行标签没有统一规律的场景,直接给每个行标签绑定对应的计算逻辑:
首先先构造你的测试DataFrame(方便验证):
import pandas as pd data = { 'Test1': [20, 10, 30, 50, 1.2, 1.3, 1.0, 2.0], 'Test2': [30, 15, 50, 80, 1.2, 1.3, 1.2, 2.1], 'Test3': [40, 13, 90, 40, 1.2, 1.3, 1.3, 2.2] } Values = pd.DataFrame(data, index=['Power1', 'Power2', 'Max_Power1', 'Max_Power2', 'Voltage1', 'Voltage2', 'Current1', 'Current2'])
然后定义每个行标签对应的计算规则,再通过apply按行执行:
# 定义行标签到计算逻辑的映射字典 calc_map = { 'Power1': lambda row: row.mean(), 'Power2': lambda row: row.mean(), 'Max_Power1': lambda row: row.max(), 'Max_Power2': lambda row: row.max(), 'Voltage1': lambda row: row.mean(), 'Voltage2': lambda row: row.mean(), 'Current1': lambda row: row.min(), 'Current2': lambda row: row.min() } # 新增Result列,按行调用对应的计算逻辑 Values['Result'] = Values.apply(lambda row: calc_map[row.name](row), axis=1)
方法2:利用行标签规律 + np.select
如果你的行标签有统一前缀(比如Power/Max_Power/Voltage/Current),用numpy.select会更高效,代码也更简洁:
import numpy as np # 定义分组条件:按行标签前缀匹配 conditions = [ Values.index.str.startswith('Power'), Values.index.str.startswith('Max_Power'), Values.index.str.startswith('Voltage'), Values.index.str.startswith('Current') ] # 对应每组的计算方式 calculations = [ Values.mean(axis=1), # Power开头的行取平均值 Values.max(axis=1), # Max_Power开头的行取最大值 Values.mean(axis=1), # Voltage开头的行取平均值 Values.min(axis=1) # Current开头的行取最小值 ] # 新增Result列 Values['Result'] = np.select(conditions, calculations)
验证结果
执行完上面任意一种方法后,你的Values DataFrame会新增Result列,最终结果如下:
| Test1 | Test2 | Test3 | Result | |
|---|---|---|---|---|
| Power1 | 20 | 30 | 40 | 30.0000 |
| Power2 | 10 | 15 | 13 | 12.6667 |
| Max_Power1 | 30 | 50 | 90 | 90.0000 |
| Max_Power2 | 50 | 80 | 40 | 80.0000 |
| Voltage1 | 1.2 | 1.2 | 1.2 | 1.2000 |
| Voltage2 | 1.3 | 1.3 | 1.3 | 1.3000 |
| Current1 | 1.0 | 1.2 | 1.3 | 1.0000 |
| Current2 | 2.0 | 2.1 | 2.2 | 2.0000 |
这完全符合你要求的各行计算规则~
内容的提问来源于stack exchange,提问作者Darth Ratus
相关产品推荐
相关产品推荐

