簡體   English   中英

使用Pandas從數據框中刪除部分字符串

[英]Remove partial string from dataframe with Pandas

如果我有這樣的數據幀:

id    str
01    abc_d(a)
02    ab_d(a)
03    abcd_e(a)
04    a_b(a)

我如何獲得如下數據幀? 對不起,我構建這個數據框來代表我的真實問題。 謝謝。

id    str
01    d
02    d
03    e
04    b

使用extract

df['str']=df['str'].str.extract("\_(.*)\(",expand=True) 
df
Out[585]: 
   id str
0   1   d
1   2   d
2   3   e
3   4   b

(錯誤的答案)

Series.str.split

df['str'] = df['str'].str.split('(').str[0].str.split('_').str[-1]    
df

   id str
0   1   d
1   2   d
2   3   e
3   4   b

(少回答錯誤)

Series.str.extract

df['str'] = df['str'].str.extract(r'_([^_]+)\(', expand=False)
df

   id str
0   1   d
1   2   d
2   3   e
3   4   b

正則表達式方法帶來了相當大的開銷,而str.extract並沒有太大的幫助使事情變得更好。


(更好的答案)

使用list comp進行re.search

import re

p = re.compile(r'(?<=_)[^_]+(?=\()')
df['str'] = [p.search(x)[0] for x in df['str'].tolist()] 
df

   id str
0   1   d
1   2   d
2   3   e
3   4   b

這應該比上述方法更快。 我發現與大多數矢量化字符串pandas方法相比,列表推導非常快,即使這確實使用了正則表達式。 我提前預編譯模式以減輕一些性能問題。


(也是一個更好的答案)

str.split與list comp

df['str'] = [
    x.split('(', 1)[0].split('_')[1] for x in df['str'].tolist()
]
df

   id str
0   1   d
1   2   d
2   3   e
3   4   b

這結合了兩個世界的優點,列表comp的性能和純python字符串拆分的速度。 應該是最快的。


性能

df_test = pd.concat([df] * 10000, ignore_index=True)

%timeit df_test['str'].str.extract(r'_([^_]+)\(', expand=False)
%timeit df_test['str'].str.split('(').str[0].str.split('_').str[-1] 
%timeit [p.search(x)[0] for x in df_test['str'].tolist()] 
%timeit [x.split('(', 1)[0].split('_')[1] for x in df_test['str'].tolist()]

70.4 ms ± 623 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
99.6 ms ± 730 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
31 ms ± 877 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
30 ms ± 431 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)  # fastest but not by much

可能是你可以嘗試split類似的例子

df['str'] = df['str'].str.split('_').str.get(1).str[0]

要么,

df['str'] = df['str'].str.split('_').str.get(1).str.split('(').str[0]

使用pd.Series.str.split 具體到您的特定格式。

df['str'] = df['str'].str.split('_').str[-1].str[0]

print(df)

   id str
0   1   d
1   2   d
2   3   e
3   4   b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM