pandas dataframe apply lambda index error












0















I have the following code



df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1])


where df2 is:



     TaxAccNo2    
0 00001379.1
1 00182218


When I run the code I get



     TaxAccNo2   TaxAccNo4
0 00001379.1 00001379
1 00182218 00182218


and IndexError: list index out of range for TaxAccNo3,



     TaxAccNo2   TaxAccNo4   TaxAccNo3
0 00001379.1 00001379 1
1 00182218 00182218


How do I fix my code to produce that output? I'm assuming its giving me the error because Index 1 doesn't have '.' but I'm not sure how to fix that.










share|improve this question





























    0















    I have the following code



    df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
    df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1])


    where df2 is:



         TaxAccNo2    
    0 00001379.1
    1 00182218


    When I run the code I get



         TaxAccNo2   TaxAccNo4
    0 00001379.1 00001379
    1 00182218 00182218


    and IndexError: list index out of range for TaxAccNo3,



         TaxAccNo2   TaxAccNo4   TaxAccNo3
    0 00001379.1 00001379 1
    1 00182218 00182218


    How do I fix my code to produce that output? I'm assuming its giving me the error because Index 1 doesn't have '.' but I'm not sure how to fix that.










    share|improve this question



























      0












      0








      0








      I have the following code



      df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
      df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1])


      where df2 is:



           TaxAccNo2    
      0 00001379.1
      1 00182218


      When I run the code I get



           TaxAccNo2   TaxAccNo4
      0 00001379.1 00001379
      1 00182218 00182218


      and IndexError: list index out of range for TaxAccNo3,



           TaxAccNo2   TaxAccNo4   TaxAccNo3
      0 00001379.1 00001379 1
      1 00182218 00182218


      How do I fix my code to produce that output? I'm assuming its giving me the error because Index 1 doesn't have '.' but I'm not sure how to fix that.










      share|improve this question
















      I have the following code



      df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
      df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1])


      where df2 is:



           TaxAccNo2    
      0 00001379.1
      1 00182218


      When I run the code I get



           TaxAccNo2   TaxAccNo4
      0 00001379.1 00001379
      1 00182218 00182218


      and IndexError: list index out of range for TaxAccNo3,



           TaxAccNo2   TaxAccNo4   TaxAccNo3
      0 00001379.1 00001379 1
      1 00182218 00182218


      How do I fix my code to produce that output? I'm assuming its giving me the error because Index 1 doesn't have '.' but I'm not sure how to fix that.







      python pandas dataframe






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 1:11









      eyllanesc

      76k103156




      76k103156










      asked Nov 21 '18 at 1:09









      AndyAndy

      437




      437
























          2 Answers
          2






          active

          oldest

          votes


















          0














          As you said, the problem is that "00182218".split(".") doesn't have a [1] index, since it's the list ["00182218"].



          A simple solution without affecting too much the code is to use a ... if ... else ... ternary operator:



          df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
          df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')


          Where the last '' is an empty string, the value with which you will fill 'TaxAccNo3' if 'TaxAccNo2' doesn't have a dot (you can replace it if you want other behaviour).



          The semantic is: put x.split('.')[1] in df2['TaxAccNo3'] if x contains a dot, otherwise put an empty string.






          share|improve this answer































            0














            Hy, I was reviewing your code, the problem is that when you use the method split() in a string the returned object is a list, and this is causing the index error, as you pointed. The solution I encountered if very simple, use a conditional in your code to prevent it from calling this index for shorter lists as follows. Hope it helps.



            df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)





            share|improve this answer























              Your Answer






              StackExchange.ifUsing("editor", function () {
              StackExchange.using("externalEditor", function () {
              StackExchange.using("snippets", function () {
              StackExchange.snippets.init();
              });
              });
              }, "code-snippets");

              StackExchange.ready(function() {
              var channelOptions = {
              tags: "".split(" "),
              id: "1"
              };
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function() {
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled) {
              StackExchange.using("snippets", function() {
              createEditor();
              });
              }
              else {
              createEditor();
              }
              });

              function createEditor() {
              StackExchange.prepareEditor({
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader: {
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              },
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              });


              }
              });














              draft saved

              draft discarded


















              StackExchange.ready(
              function () {
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53403917%2fpandas-dataframe-apply-lambda-index-error%23new-answer', 'question_page');
              }
              );

              Post as a guest















              Required, but never shown

























              2 Answers
              2






              active

              oldest

              votes








              2 Answers
              2






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              0














              As you said, the problem is that "00182218".split(".") doesn't have a [1] index, since it's the list ["00182218"].



              A simple solution without affecting too much the code is to use a ... if ... else ... ternary operator:



              df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
              df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')


              Where the last '' is an empty string, the value with which you will fill 'TaxAccNo3' if 'TaxAccNo2' doesn't have a dot (you can replace it if you want other behaviour).



              The semantic is: put x.split('.')[1] in df2['TaxAccNo3'] if x contains a dot, otherwise put an empty string.






              share|improve this answer




























                0














                As you said, the problem is that "00182218".split(".") doesn't have a [1] index, since it's the list ["00182218"].



                A simple solution without affecting too much the code is to use a ... if ... else ... ternary operator:



                df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
                df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')


                Where the last '' is an empty string, the value with which you will fill 'TaxAccNo3' if 'TaxAccNo2' doesn't have a dot (you can replace it if you want other behaviour).



                The semantic is: put x.split('.')[1] in df2['TaxAccNo3'] if x contains a dot, otherwise put an empty string.






                share|improve this answer


























                  0












                  0








                  0







                  As you said, the problem is that "00182218".split(".") doesn't have a [1] index, since it's the list ["00182218"].



                  A simple solution without affecting too much the code is to use a ... if ... else ... ternary operator:



                  df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
                  df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')


                  Where the last '' is an empty string, the value with which you will fill 'TaxAccNo3' if 'TaxAccNo2' doesn't have a dot (you can replace it if you want other behaviour).



                  The semantic is: put x.split('.')[1] in df2['TaxAccNo3'] if x contains a dot, otherwise put an empty string.






                  share|improve this answer













                  As you said, the problem is that "00182218".split(".") doesn't have a [1] index, since it's the list ["00182218"].



                  A simple solution without affecting too much the code is to use a ... if ... else ... ternary operator:



                  df2['TaxAccNo4'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[0])
                  df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if '.' in x else '')


                  Where the last '' is an empty string, the value with which you will fill 'TaxAccNo3' if 'TaxAccNo2' doesn't have a dot (you can replace it if you want other behaviour).



                  The semantic is: put x.split('.')[1] in df2['TaxAccNo3'] if x contains a dot, otherwise put an empty string.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 21 '18 at 1:19









                  Julian PellerJulian Peller

                  8941511




                  8941511

























                      0














                      Hy, I was reviewing your code, the problem is that when you use the method split() in a string the returned object is a list, and this is causing the index error, as you pointed. The solution I encountered if very simple, use a conditional in your code to prevent it from calling this index for shorter lists as follows. Hope it helps.



                      df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)





                      share|improve this answer




























                        0














                        Hy, I was reviewing your code, the problem is that when you use the method split() in a string the returned object is a list, and this is causing the index error, as you pointed. The solution I encountered if very simple, use a conditional in your code to prevent it from calling this index for shorter lists as follows. Hope it helps.



                        df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)





                        share|improve this answer


























                          0












                          0








                          0







                          Hy, I was reviewing your code, the problem is that when you use the method split() in a string the returned object is a list, and this is causing the index error, as you pointed. The solution I encountered if very simple, use a conditional in your code to prevent it from calling this index for shorter lists as follows. Hope it helps.



                          df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)





                          share|improve this answer













                          Hy, I was reviewing your code, the problem is that when you use the method split() in a string the returned object is a list, and this is causing the index error, as you pointed. The solution I encountered if very simple, use a conditional in your code to prevent it from calling this index for shorter lists as follows. Hope it helps.



                          df2['TaxAccNo3'] = df2['TaxAccNo2'].apply(lambda x: x.split('.')[1] if len(x.split('.'))>1 else x)






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 21 '18 at 1:51









                          Pedro MorescoPedro Moresco

                          214




                          214






























                              draft saved

                              draft discarded




















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid



                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.


                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function () {
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53403917%2fpandas-dataframe-apply-lambda-index-error%23new-answer', 'question_page');
                              }
                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                              Alcedinidae

                              Origin of the phrase “under your belt”?