首页 > 解决方案 > 熊猫根据模式计算差异

问题描述

我有一个熊猫数据框

 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 结尾。需要以编程方式执行此操作,而不是对列进行硬编码

标签: pythonpandas

解决方案


概括这一点:

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_indexerwhich 获取此类列的索引。

发布这个我们压缩它们并计算差异,并存储在一个列表中并连接它们。最后访问要分配的值。

编辑:要处理字符串,您可以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

推荐阅读