加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 10:33:18 所属栏目:Python 来源:网络整理
导读:所以我有一个具有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
所以我有一个具有180000个值的DataFrame,我需要(1)逐行替换单元格中的重复值和某些值,以及(2)重新排列.这是我的DataFrame,df:

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,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更快.使用针对数字数据优化的函数的原始版本,您将特别看到速度增益.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读