添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

所以我有一个包含 180000+ 个值的 DataFrame,我需要(1)按行替换单元格中的重复值和某些值,以及(2)重新排列。 这是我的数据帧,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。 并且禁止的字符串是'not'。

所以我需要做的是检查列 item1~6 用 nan 替换 makrc 列中包含的字符串。 同样,我也想用 nan's 替换 'not's。 将字符串替换为 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 而不是因为我需要将项目列中的每个“not”字符串替换为 np.nan。 我也重新排列了项目。

我尝试将所有项目列组合为一个列表并替换它,但有几行只有 np.nan 项目。 你们能推荐一个理想的过程来解决我的问题吗? 非常感谢。

首先,提取一部分以 item - 开头的列

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) 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 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 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

迈向更好的表现

您可以使用 justified 适用于对象数组 的 Divakar 函数 的修改版本 -

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') 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 . 使用针对数字数据优化的函数的原始版本,您将尤其看到速度提升。

  • python打包的exe文件设置开机自启动和关闭开机自启动
  • Python修改Windows桌面壁纸
  • SystemError: Negative size passed to PyUnicode_New
  • Selenium 的安装和基本使用
  • urllib库的使用
  • Python创建字典的八种方式
  •