首先,从项目开始提取一列列 –
m = df.columns.str.contains('item')
i = df.iloc[:, m]
屏蔽符合您标准的所有值.使用isin –
j = i[~i.isin(df.makrc.tolist() + ['not'])]
现在.根据NaN排序值并分配回来 –
df.loc[:, m] = j.apply(sorted, key=pd.isnull, axis=1)
df
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi NaN NaN NaN NaN NaN
1 da32 2013 sa rye app NaN NaN NaN NaN NaN
2 da14 2013 sa pro pan fan NaN NaN NaN NaN
细节
i
item1 item2 item3 item4 item5 item6
0 furi apt NaN NaN NaN NaN
1 rye app NaN NaN NaN NaN
2 not pro pan fan NaN NaN
j
item1 item2 item3 item4 item5 item6
0 furi NaN NaN NaN NaN NaN
1 NaN app NaN NaN NaN NaN
2 NaN NaN pan fan NaN NaN
迈向更好的表现
您可以使用适用于对象阵列的Divakar justified函数的修改版本 –
def justify(a, invalid_val=0, axis=1, side='left'):
"""
Justifies a 2D array
Parameters
----------
A : ndarray
Input array to be justified
axis : int
Axis along which justification is to be made
side : str
Direction of justification. It could be 'left', 'right', 'up', 'down'
It should be 'left' or 'right' for axis=1 and 'up' or 'down' for axis=0.
"""
if invalid_val is np.nan:
mask = pd.notnull(a)
else:
mask = a!=invalid_val
justified_mask = np.sort(mask,axis=axis)
if (side=='up') | (side=='left'):
justified_mask = np.flip(justified_mask,axis=axis)
out = np.full(a.shape, invalid_val, dtype=object)
if axis==1:
out[justified_mask] = a[mask]
else:
out.T[justified_mask.T] = a.T[mask.T]
return out
df.loc[:, m] = justify(j.values, invalid_val=np.nan, axis=1, side='left')
df
key sellyr brand makrc item1 item2 item3 item4 item5 item6
0 da12 2013 imp apt furi NaN NaN NaN NaN NaN
1 da32 2013 sa rye app NaN NaN NaN NaN NaN
2 da14 2013 sa pro pan fan NaN NaN NaN NaN
这应该(希望)比调用apply更快.使用针对数字数据优化的函数的原始版本,您将特别看到速度增益.