簡體   English   中英

Pandas - 使用替換+正則表達式從字符串列中提取數值

[英]Pandas - extract numeric values from string column using replace + regex

我有一個 dataframe 的列,其中包含許多值范圍。 下面的例子:

dirty_col = pd.Series([5, 6, '1-2', '40-60', 10])

我正在嘗試清理此列,生成一個具有平均值范圍的新列。 預期結果:

clean_col = pd.Series([5, 6, 1.5, 50, 10])

我正在嘗試 map 在矢量化映射函數中使用正則表達式,例如:

clean_col = pd.Series([5, 6, '1-2', '40-60', 10]).replace({'^[0-9]-[0-9]$':--average here--},regex=True)

但我被困在這里。 如何使用映射字典和正則表達式獲得上述預期結果? 我知道我可以直接在 dataframe 中工作,將文本按“-”分割,然后取平均值,但是,我已經在上面的字典中有許多其他的清理映射,繼續使用同一個字典會更方便和更干凈所有的清潔。

我認為我正在尋找的解決方案可能使用 lambdas,或者從字典內部調用的額外 function,但我無法弄清楚如何做到這一點。

我不認為pandas.Series.replace支持可調用。 使用pandas.eval的一種可能方法:

dirty_col.replace({'^(\d+)-(\d+)$': "(\\1+\\2)/2"},regex=True).apply(pd.eval)

Output:

0     5.0
1     6.0
2     1.5
3    50.0
4    10.0
dtype: float64

您可以嘗試series.str.replacerepl作為可調用和fillna返回

f_repr = lambda m: str(sum(map(int, m[0].split('-')))/2)
s_out = s.str.replace(r'^[0-9]+-[0-9]+$', f_repr).fillna(s)

Out[30]:
0       5
1       6
2     1.5
3    50.0
4      10
dtype: object

暫無
暫無

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

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