我有一個大型(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.
編輯以添加目標狀態:列S應包含以下條目:'n'、'o'、''。決賽也可能是 NaN。
有沒有一種合理的方法可以在沒有單獨的函式呼叫的情況下做到這一點?
uj5u.com熱心網友回復:
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:)
uj5u.com熱心網友回復:
從特定列中洗掉特定值,您可以使用 .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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468424.html
