1

I have a dataframe with a column Fib, I am trying to grab a substring from it:

Could anyone please tell me why this code does not work:

df['new'] = df['Fib'].apply(lambda x:x.str[2:10])

AttributeError: 'str' object has no attribute 'str'

But if i do this, it will work:

df['new_col'] = df['Fib'].astype(str).str[2:10]

I am trying to solve the above problem with apply+lambda just to get some experience with it. Thank you

3
  • 5
    df['new'] = df['Fib'].apply(lambda x:x[2:10]) don't use str inside the lambda Commented Dec 31, 2018 at 9:21
  • 1
    My recommendation here would be to not use apply. Use slice instead Commented Dec 31, 2018 at 10:01
  • Using df['new'] = df['Fib'].apply(lambda x:x[2:10]) generated an error: df['new'] = df['Fib'].apply(lambda x:x[2:10]) Commented Dec 31, 2018 at 10:06

1 Answer 1

4

The problem in your code is that the lambda function you apply along the rows of your series will be receiving a string as it appears. Here's an example to illustrate this:

df = pd.DataFrame({'num':[1,4,2], 'alpha':['apple','orange','peach']})
df['alpha'].apply(lambda x:type(x))
<class 'str'>
<class 'str'>
<class 'str'>

Note that Series.str methods are only for Series, as clearly stated in the documentation:

Vectorized string functions for Series and Index

So for your example you should avoid using apply. Instead do:

df['alpha'].str[2:10]

0     ple
1    ange
2     ach
Name: alpha, dtype: object

If what you want is to use apply instead as you mention, you simply need lambda x: x[2:10] as you are directly slicing the string:

df['alpha'].apply(lambda x: x[2:10])
0     ple
1    ange
2     ach
Name: alpha, dtype: object
Sign up to request clarification or add additional context in comments.

Comments