python - 带有条件熊猫的列均值
问题描述
我有一个示例数据框如下:
data = pd.DataFrame({'Date':[20210101,20210102,20210103,20210104,20210105],'coef1':[1,2,5,4,3],'coef2':[1,1,2,6,3],'coef3':[1,1,1,1,1]})
如果这些值不等于 1,我希望超过 'coef1' 、'coef2' 和 'coef3' 的意思。
我编写了一个函数并将其应用于我的 datframe 并获得了我想要的输出,但是我想要一种 Python 的方式来实现这一点。
def final_coef(x):
coef_list = []
if x['coef1'] == 1:
pass
else:
coef_list.append(x['coef1'])
if x['coef2'] == 1:
pass
else:
coef_list.append(x['coef2'])
if x['coef3'] == 1:
pass
else:
coef_list.append(x['coef3'])
return np.mean(coef_list)
data['Final_coef'] = data.apply(lambda row: final_coef(row),axis = 1)
解决方案
这可以在一行中完成,但需要执行三个步骤:
- 在任何地方应用
np.nan
一个值等于1
usingdf.where(df.ne(1), np.nan)
- 使用计算每行的平均值(不
NaNs
包括在内)df[['coef1', 'coef2', 'coef3']].mean(axis=1))
- 将此计算的结果分配给一个新列,使用
df.assign()
代码示例
df = df.assign(final_coef=df.where(df.ne(1), np.nan)[['coef1', 'coef2', 'coef3']].mean(axis=1))
>>>df
Date coef1 coef2 coef3 final_coef
0 20210101 1 1 1 NaN
1 20210102 2 1 1 2.0
2 20210103 5 2 1 3.5
3 20210104 4 6 1 5.0
4 20210105 3 3 1 3.0
推荐阅读
- java - Java + UDP + DatagramSocket:当 UDP 设计为无连接时,为什么会抛出 PortUnreachableException?
- docker - Traefik docker 默认域配置
- twilio - 德语交互式语音响应
- wso2 - 带有声明的 WSO2(5.8 版)的多实例问题
- javascript - 如何使用请求映射修复 thymleaf 错误?
- html - 下拉菜单有效,但仅当我悬停而不单击时
- jenkins - 检查是否存在另一个管道
- javascript - 如何处理从 JavaScript 模块导入的动态对象?
- user-interface - Colab 之上的简单 UI
- ruby-on-rails - 什么是 Rails 中的 MigrationProxy?