python – 在pandas DataFrame中左对齐字符串值

python – 在pandas DataFrame中左对齐字符串值,第1张

概述所以我有一个具有180000个值的DataFrame,我需要(1)逐行替换单元格中的重复值和某些值,以及(2)重新排列.这是我的DataFrame,df: key sellyr brand makrc item1 item2 item3 item4 item5 item60 da12 2013 imp apt furi apt nan 所以我有一个具有180000个值的DataFrame,我需要(1)逐行替换单元格中的重复值和某些值,以及(2)重新排列.这是我的DataFrame,df:

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中左对齐字符串值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1191033.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存