繁体   English   中英

用 0 替换列中最后一个非零之前的所有值

[英]Replace all values before last non-zero in a column with 0

我有 2 个具有相同索引和形状的数据框,比如说 A 和 B。我的目标是计算 df_B 中每行的总和,但是如果对于 df_A 中最后一个非零值以下的任何行,这些相应的行将不会被计算在内在 df_B 中的总和。 这是一个展示我在做什么的例子:

df_A = pd.DataFrame({'col1': [1,1,0,1,0], 'col2': [1,0,0,0,0]})
df_B = pd.DataFrame({'col1': [2,2,2,2,2], 'col2': [2,2,2,2,2]})

OR:

df_A:
col1|col2
1.  |1.  
1.  |0
0.  |0
1.  |0
0.  |0

df_B:
col1|col2
2.  |2.  
2.  |2
2.  |2
2.  |2
2.  |2

我想要的输出如下所示:

df_B:
col1|col2
2.  |2.  
2.  |0
2.  |0
2.  |0
0.  |0

对于 df_A 中的每一列,从最后一个非零值开始,df_B 中此位置之后的值将为 0。

这是我尝试过但被卡住的方法:

  1. 获取每列中最后一个非零值的索引位置,因此 ([3,1]) 为 df_A 中的 2 col。
row_ix = df_A.shape[0]-df_A.ne(0).values[::-1].argmax(0)-1
  1. 对于每一列,将 row_ix 位置之前的值设置为 0(这与我的解决方案本质上相反,但我可以反转它以获得我的答案)
for i in row_ix:
    for col in df.columns:
        df[col].values[:row_ix[i]] = 0

这是一种正确的方法,还是有更好的方法来做到这一点? 谢谢!

尝试这个 :

   def zero_index(df, column_name):
       indexer = df.index[df[column_name].eq(0)]
        # checks if the values are consecutive
        if np.any(np.diff(indexer) > 1):
            return indexer[-1]
        return indexer[0]


df_B.loc[zero_index(df_A, "col1") :, "col1"] = 0
df_B.loc[zero_index(df_A, "col2") :, "col2"] = 0

df_B


   col1 col2
0   2   2
1   2   0
2   2   0
3   2   0
4   0   0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM