所以我有一个具有180000个值的DataFrame,我需要(1)逐行替换单元格中的重复值和某些值,以及(2)重新排列.这是我的DataFrame,df: key sellyr brand makrc item1 item2 item3 item4 item5 item60 da12 2013 imp apt fu
key sellyr brand makrc item1 item2 item3 item4 item5 item6 0 da12 2013 imp apt furi apt nan nan nan nan 1 da32 2013 sa rye rye app nan nan nan nan 2 da14 2013 sa pro not pro pan fan nan nan ........
nan值代表np.nan.禁止的字符串是’不’.
所以我需要做的是检查列item1~6用nan替换makrc列中包含的字符串.同样,我也想用nan替换’not”.在将字符串替换为np.nan之后,我需要重新排列item1~6以将非nan数据左对齐到最左边的空单元格,如下所示(预期输出):
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 ........
因此,您可以在第一个索引中看到,我已删除了item2中的apt字符串并更改为np.nan,因为相同的字符串位于makrc列中.在索引1中,我删除了黑麦并替换为np.nan.但这一次,我将’app’字符串从item2重新排列为item1,因为np.nan值应该在值之后.在索引2中,我已经替换了pro而不是因为我需要将item列中的每个’nottring字符串替换为np.nan.我也重新安排了这些物品.
我已经尝试将所有项目列组合为一个列表并替换它,但是有几行只有np.nan项目.你们能推荐一个理想的过程来解决我的问题吗?非常感谢.
首先,从项目开始提取一列列 –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更快.使用针对数字数据优化的函数的原始版本,您将特别看到速度增益.