我有一个熊猫数据框

 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应该得到后续的区别。即A-B值应在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来获取此类列的索引。

发布后,我们将它们压缩并计算差异,然后存储在列表中并合并它们。最后访问要分配的值。

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

关于python - Pandas 根据模式计算差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56886589/

10-12 22:17