加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在python中向左行值,直到不为空

发布时间:2020-12-20 12:14:46 所属栏目:Python 来源:网络整理
导读:我必须处理大量数据.每行以1或0开头.我需要一个数据帧,其中每行以1开头,因此我必须向左移动所有行值,直到第一个值为1. 例如: 0 1 0 0 1 0 01 0 0 0 0 1 10 0 0 1 0 0 10 0 0 0 0 1 1 结果必须是这样的: 1 0 0 1 0 0 01 0 0 0 0 1 11 0 0 1 0 0 01 1 0 0 0
我必须处理大量数据.每行以1或0开头.我需要一个数据帧,其中每行以1开头,因此我必须向左移动所有行值,直到第一个值为1.

例如:

0 1 0 0 1 0 0
1 0 0 0 0 1 1
0 0 0 1 0 0 1
0 0 0 0 0 1 1

结果必须是这样的:

1 0 0 1 0 0 0
1 0 0 0 0 1 1
1 0 0 1 0 0 0
1 1 0 0 0 0 0

我不想使用for,while等,因为我需要一些使用pandas或numpy的更快的方法.

你有这个问题的想法吗?

解决方法

您可以使用cummax来掩盖所有需要移位的位置作为NaN并进行排序

df[df.cummax(1).ne(0)].apply(lambda x : sorted(x,key=pd.isnull),1).fillna(0).astype(int)
Out[310]: 
   1  2  3  4  5  6  7
0  1  0  0  1  0  0  0
1  1  0  0  0  0  1  1
2  1  0  0  1  0  0  0
3  1  1  0  0  0  0  0

或者我们使用Divakar编写的函数justify(比应用排序快得多)

pd.DataFrame(justify(df[df.cummax(1).ne(0)].values,invalid_val=np.nan,axis=1,side='left')).fillna(0).astype(int)
Out[314]: 
   0  1  2  3  4  5  6
0  1  0  0  1  0  0  0
1  1  0  0  0  0  1  1
2  1  0  0  1  0  0  0
3  1  1  0  0  0  0  0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读