
key sellyr brand makrc item1 item2 item3 item4 item5 item60 da12 2013 imp apt furi apt nan nan nan nan1 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 item60 da12 2013 imp apt furi nan nan nan nan nan1 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 item60 da12 2013 imp apt furi NaN NaN NaN NaN NaN1 da32 2013 sa rye app NaN NaN NaN NaN NaN2 da14 2013 sa pro pan fan NaN NaN NaN NaN
细节
i item1 item2 item3 item4 item5 item60 furi apt NaN NaN NaN NaN1 rye app NaN NaN NaN NaN2 not pro pan fan NaN NaN
j item1 item2 item3 item4 item5 item60 furi NaN NaN NaN NaN NaN1 NaN app NaN NaN NaN NaN2 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,sIDe='left')df key sellyr brand makrc item1 item2 item3 item4 item5 item60 da12 2013 imp apt furi NaN NaN NaN NaN NaN1 da32 2013 sa rye app NaN NaN NaN NaN NaN2 da14 2013 sa pro pan fan NaN NaN NaN NaN
这应该(希望)比调用apply更快.使用针对数字数据优化的函数的原始版本,您将特别看到速度增益.
总结以上是内存溢出为你收集整理的python – 在pandas DataFrame中左对齐字符串值全部内容,希望文章能够帮你解决python – 在pandas DataFrame中左对齐字符串值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)