我必须处理大量数据.每行以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