为了账号安全,请及时绑定邮箱和手机立即绑定

为每个列对组合查找以前的非零对,并为使用 python 的人创建单独的列

为每个列对组合查找以前的非零对,并为使用 python 的人创建单独的列

饮歌长啸 2021-09-02 15:39:13
我有一个这样的数据框:A     B1     10     02     30     00     05     40     30     0我想添加具有以下条件的另外两列:对于每个 A 和 B 对,先前的非零对值将添加到其他两列中,但第一次在两列中都为零,例如,输出将类似于:A     B    C    D1     1    0    00     0    1    12     3    1    10     0    2    30     0    2    35     4    2    30     3    5    40     0    0    3我可以使用循环来做到这一点,但我希望以大多数 pythonic 方式执行最少的时间。
查看完整描述

2 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

我分解步骤


mask=df.A.ne(0)|df.B.ne(0) # get the target row 

df1=df[mask] # filter from original df

df1.index+=1 # get the index increase by one 

df1.columns=['C','D'] # reassign the columns 

pd.concat([df,df1],axis=1).ffill().fillna(0).astype(int) # using ffill

Out[569]: 

   A  B  C  D

0  1  1  0  0

1  0  0  1  1

2  2  3  1  1

3  0  0  2  3

4  0  0  2  3

5  5  4  2  3

6  0  3  5  4

7  0  0  0  3


查看完整回答
反对 回复 2021-09-02
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

我相信一种方法是将A和B用作您的C和D列,将两者都为 0 的行替换为nan,向前填充,最后NaN用 0替换顶部:


df[['C','D']] = df[['A','B']].shift()


df.loc[(df[['C','D']] == 0).all(1), ['C','D']] = np.nan


df.ffill().fillna(0).astype(int)


   A  B  C  D

0  1  1  0  0

1  0  0  1  1

2  2  3  1  1

3  0  0  2  3

4  0  0  2  3

5  5  4  2  3

6  0  3  5  4

7  0  0  0  3


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信