从pandas数据框架列中删除子字符串



我有一个大型(45K行)数据集,在少数情况下我需要从特定列中删除特定值。数据集足够大,我希望尽可能避免使用apply

下面是一个样本数据集:

df = pd.DataFrame({"ID": [30, 40, 50], "T": ["C", "D", "E"], "S": ["n", "o/p", "p"]})
drops = pd.DataFrame({"ID": [40, 50],"Column": ["S", "S"],"Rule": ["Remove", "Remove"],"Override": ["p", "p"]})

我目前的解决方案是使用:

(
df.merge(
drops.pivot(index="ID", columns="Column", values="Override").reset_index()[["ID", "S"]],
how="left",
on=["ID", "S"],
indicator="_dropS",
).assign(
S=lambda d_: d_.S.mask(d_._dropS == "both", np.nan)))

但是这只成功地删除了一个条目。我的一般Python知识告诉我用分隔符"/"分割列S,删除匹配的条目,并再次将列表连接在一起(S列中可能有两个以上的条目),但我似乎无法在不使用apply的情况下在DataFrame中工作。

编辑添加目标状态:列S应该有条目:'n', 'o', ''。最后一个也可以是NaN。

有没有一种合理的方法来做到这一点,而不需要单独的函数调用?

IIUC是一个提供预期输出的解决方案,但不知道性能如何。我对你的反馈很感兴趣。

#from your sample data
df = pd.DataFrame({"ID": [30, 40, 50], "T": ["C", "D", "E"], "S": ["n", "o/p", "p"]})
drops = pd.DataFrame({"ID": [40, 50],"Column": ["S", "S"],"Rule": ["Remove", "Remove"],"Override": ["p", "p"]})
pivoted_rules = drops.pivot(index="ID", columns="Column", values="Override").rename(columns={'S': 'compare_S'})
res = pd.concat([df.set_index('ID'),pivoted_rules],axis=1).fillna('fill_value')
res['S'] = [''.join([x for x in a if x!=b]) for a, b in zip(res['S'].str.split('/'), res['compare_S'])]
res = res.drop('compare_S', axis=1).reset_index()
print(res)
ID  T   S
0   30  C   n
1   40  D   o
2   50  E   

没有使用apply:)

从特定列中删除特定值,可以使用.str.replace

df = pd.DataFrame({"ID": [30, 40, 50], "T": ["C", "D", "E"], "S": ["n", "o/p", "p"]})
df.loc[:,'S'] = df['S'].str.replace(r'[/p]','')

结果:

ID  T  S
0  30  C  n
1  40  D  o
2  50  E

最新更新