gpt4 book ai didi

python - 对 findall() 列表进行切片以获取值

转载 作者:行者123 更新时间:2023-12-02 05:43:54 25 4
gpt4 key购买 nike

我正在使用 Anaconda Jupyter Notebook 和 Python 3 重新创建 DataCamp 练习。该练习是导入 csv 文件,使用在 lambda 函数内使用 .replace() 方法删除“total_dollar”列中的美元符号。然后在另一个新列中再次执行相同的操作,但这次使用 RegEx.findall()。我遇到麻烦的地方是使用 [0] 对 re.findall() 列表进行切片以获取值。 DataCamp 指令说: 请注意,因为 re.findall() 返回一个列表,所以您必须对其进行切片才能访问实际值。

以下代码在他们的网站上给了我正确的答案,但在 Jupyter Notebook 中却没有。

tips2 = pd.read_csv('c:\\datacamp\\data\\tips2.csv')
print(tips2.head())

# Write the lambda function using replace
tips2['total_dollar_replace'] = tips2.total_dollar.apply(lambda x: x.replace('$', ''))

# Write the lambda function using regular expressions
tips2['total_dollar_re'] = tips2.total_dollar.apply(lambda x: re.findall('\d+\.\d+', x)[0])

# Print the head of tips
print(tips2.head())

输出如下:

total_bill   tip     sex smoker  day    time  size total_dollar
0 16.99 1.01 Female No Sun Dinner 2.0 $16.99
1 10.34 1.66 Male No Sun Dinner 3.0 $10.34
2 21.01 3.50 Male No Sun Dinner 3.0 $21.01
3 23.68 3.31 Male No Sun Dinner 2.0 $23.68
4 24.59 3.61 Female No Sun Dinner 4.0 $24.59


---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-152-598533768fa6> in <module>
28
29 # Write the lambda function using regular expressions
---> 30 tips2['total_dollar_re'] = tips2.total_dollar.apply(lambda x: re.findall('\d+\.\d+', x)[0])
31
32

C:\conda\envs\datacamp\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
4036 else:
4037 values = self.astype(object).values
-> 4038 mapped = lib.map_infer(values, f, convert=convert_dtype)
4039
4040 if len(mapped) and isinstance(mapped[0], Series):

pandas\_libs\lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-152-598533768fa6> in <lambda>(x)
28
29 # Write the lambda function using regular expressions
---> 30 tips2['total_dollar_re'] = tips2.total_dollar.apply(lambda x: re.findall('\d+\.\d+', x)[0])
31
32

IndexError: list index out of range

去掉索引切片器,输出会更好,但不完全是它应该的样子:

   total_bill   tip     sex smoker  day    time  size total_dollar  \
0 16.99 1.01 Female No Sun Dinner 2.0 $16.99
1 10.34 1.66 Male No Sun Dinner 3.0 $10.34
2 21.01 3.50 Male No Sun Dinner 3.0 $21.01
3 23.68 3.31 Male No Sun Dinner 2.0 $23.68
4 24.59 3.61 Female No Sun Dinner 4.0 $24.59

total_dollar_replace total_dollar_re
0 16.99 [16.99]
1 10.34 [10.34]
2 21.01 [21.01]
3 23.68 [23.68]
4 24.59 [24.59]

最后一列不应该是一个列表,这应该是使用 [0] 切片器的目的。非常感谢您帮助我了解我所缺少的内容。

最佳答案

IndexError 似乎是由正则表达式返回不匹配的一行或多行引起的。或者换句话说,re.findall() 返回长度为 0 的列表,并且您无法索引到空列表。如果您愿意放弃 lambda 函数而选择完整的函数并编写如下内容,则可以解决此问题:

def my_regex_fun(x):
try:
return re.findall('\d+\.\d+', x)[0]
except IndexError:
return None # Return your choice of whatever here. np.NaN might be a good option

tips2['total_dollar_re'] = tips2.total_dollar.apply(my_regex_fun)

这将解决 IndexError 问题,但不会解决任何其他可能出现的问题。

关于python - 对 findall() 列表进行切片以获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014055/

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