gpt4 book ai didi

python - 左对齐 pandas DataFrame 中的字符串值

转载 作者:行者123 更新时间:2023-12-01 02:21:41 25 4
gpt4 key购买 nike

所以我有一个包含 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 将 makrc 列中包含的字符串替换为 nan。另外,我还想用 nan 替换 '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,因为我需要将项目列中的每个“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)
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 更快。使用针对数值数据优化的函数的原始版本,您尤其会看到速度的提升。

关于python - 左对齐 pandas DataFrame 中的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47897166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com