python - 熊猫根据模式计算差异
问题描述
我有一个熊猫数据框
df
Category NET A B C_DIFF 1 2 DD_DIFF .....
0 tom CD 10 20 NaN 30 40 NaN
1 tom CD 100 200 NaN 300 400 NaN
2 tom CD 100 200 NaN 300 400 NaN
3 tom CD 100 200 NaN 300 400 NaN
4 tom CD 100 200 NaN 300 400 NaN
现在我的列名以 _DIFF 结尾,即 C_DIFF 和 DD_DIFF 应该得到后续的区别。即,AB 值应在 C_DIFF 中,1-2 差异应填充 DD_DIFF。如何获得所需的输出。
编辑:有 20 列以 _DIFF 结尾。需要以编程方式执行此操作,而不是对列进行硬编码
解决方案
概括这一点:
m=df.columns.get_indexer(df.filter(like='DIFF').columns)
df.iloc[:,m]=pd.concat([df.iloc[:,a]-df.iloc[:,b] for a,b in zip(m-2,m-1)],axis=1).values
print(df)
Category NET A B C_DIFF 1 2 DD_DIFF
0 tom CD 10 20 -10 30 40 -10
1 tom CD 100 200 -100 300 400 -100
2 tom CD 100 200 -100 300 400 -100
3 tom CD 100 200 -100 300 400 -100
4 tom CD 100 200 -100 300 400 -100
解释:
df.filter()
将过滤具有名称的列DIFF
。
df.columns.get_indexer
正在使用pd.Index.get_indexer
which 获取此类列的索引。
发布这个我们压缩它们并计算差异,并存储在一个列表中并连接它们。最后访问要分配的值。
编辑:要处理字符串,您可以pd.to_numeric()
帮助errors='coerce'
:
m=df.columns.get_indexer(df.filter(like='DIFF').columns)
df.iloc[:,m]=pd.concat([pd.to_numeric(df.iloc[:,a],errors='coerce')-
pd.to_numeric(df.iloc[:,b],errors='coerce') for a,b in zip(m-2,m-1)],axis=1).values
推荐阅读
- nativescript - 无法使用任何插件。“模块...未找到元素...”
- r - 在 R 4.0.0 之前安装了包“XXX”:请重新安装
- c# - ASP .NET Web Forms 项目中带有 TX 文本控件的 licenses.licx 文件存在问题
- reactjs - 使用材质框架在渲染中编写类时显示错误
- database-migration - 将论坛从 phpBB 3.0.9 迁移到 nodeBB 1.14.2,无需迁移帐户
- perfino - perfino 4.0是否支持mysql?
- amazon-web-services - 将 IAM 用户限制为单个 VPC
- javascript - 如何在 html 的叠加层中添加文本?
- android - HTTPUrlConnection 在 getOutputStream().write 上使应用程序崩溃(挂起,没有抛出异常)
- c# - MappedDiagnosticsLogicalContext 类中 Set 方法和 SetScoped 方法的区别