How to use math.log10 function on whole pandas dataframe

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












9















I want to take the logarithm of every value in a pandas dataframe. I have tried this but it does not work:



#Reading data from excel and rounding values on 2 decimal places
import math
import pandas as pd

data = pd.read_excel("DataSet.xls").round(2)
log_data= math.log10(data)


It gives me this error:




TypeError: must be real number, not DataFrame




Do you have any idea what to do?










share|improve this question




























    9















    I want to take the logarithm of every value in a pandas dataframe. I have tried this but it does not work:



    #Reading data from excel and rounding values on 2 decimal places
    import math
    import pandas as pd

    data = pd.read_excel("DataSet.xls").round(2)
    log_data= math.log10(data)


    It gives me this error:




    TypeError: must be real number, not DataFrame




    Do you have any idea what to do?










    share|improve this question


























      9












      9








      9


      1






      I want to take the logarithm of every value in a pandas dataframe. I have tried this but it does not work:



      #Reading data from excel and rounding values on 2 decimal places
      import math
      import pandas as pd

      data = pd.read_excel("DataSet.xls").round(2)
      log_data= math.log10(data)


      It gives me this error:




      TypeError: must be real number, not DataFrame




      Do you have any idea what to do?










      share|improve this question
















      I want to take the logarithm of every value in a pandas dataframe. I have tried this but it does not work:



      #Reading data from excel and rounding values on 2 decimal places
      import math
      import pandas as pd

      data = pd.read_excel("DataSet.xls").round(2)
      log_data= math.log10(data)


      It gives me this error:




      TypeError: must be real number, not DataFrame




      Do you have any idea what to do?







      python pandas numpy






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Mar 6 at 19:08









      yatu

      15.6k41542




      15.6k41542










      asked Mar 6 at 13:42









      AleksandarAleksandar

      11818




      11818






















          3 Answers
          3






          active

          oldest

          votes


















          20














          Use the numpy version, not math



          import numpy as np

          np.log10(df)





          share|improve this answer























          • Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

            – Aleksandar
            Mar 6 at 17:13






          • 1





            (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

            – Christoph Burschka
            Mar 6 at 17:23











          • @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

            – Draconis
            Mar 6 at 21:04






          • 1





            @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

            – user2357112
            Mar 7 at 0:05


















          12














          From what it seems math.log10 cannot handle neither pandas dataframes nor ndarrays.



          So one option would be to go with numpy, which also includes a function to compute the base 10 logarithm, np.log10, and reconstruct the dataframe as pointed out in other solutions.



          Or if you want to go with math.log10, and the same would apply to other functions that cannot be directly vectorized, you can use DataFrame.applymap to apply math.log10 to the dataframe elementwise. Do note however that this solution will be slower than a vectorized approach using np.log10.




          Use case



          Here's an example of how this could be done using DataFrame.applymap:



          df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))

          print(df)
          a b c d e f
          0 3 4 1 1 2 1
          1 4 4 4 3 4 1
          2 4 3 3 1 4 1
          3 3 4 1 3 1 1
          4 1 2 3 4 2 1
          5 1 3 3 1 4 3

          df.applymap(math.log10)

          a b c d e f
          0 0.477121 0.602060 0.000000 0.000000 0.30103 0.000000
          1 0.602060 0.602060 0.602060 0.477121 0.60206 0.000000
          2 0.602060 0.477121 0.477121 0.000000 0.60206 0.000000
          3 0.477121 0.602060 0.000000 0.477121 0.00000 0.000000
          4 0.000000 0.301030 0.477121 0.602060 0.30103 0.000000
          5 0.000000 0.477121 0.477121 0.000000 0.60206 0.477121



          For the numpy solution, you could take the np.log10 of the dataframe, and reconstruct it as:



          pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)





          share|improve this answer
































            4














            You may want to use the applymap method to apply math.log10 on the whole dataframe, here is the documentation.



            You can test it:



            df.applymap(math.log10)





            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%2f55024529%2fhow-to-use-math-log10-function-on-whole-pandas-dataframe%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              3 Answers
              3






              active

              oldest

              votes








              3 Answers
              3






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              20














              Use the numpy version, not math



              import numpy as np

              np.log10(df)





              share|improve this answer























              • Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

                – Aleksandar
                Mar 6 at 17:13






              • 1





                (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

                – Christoph Burschka
                Mar 6 at 17:23











              • @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

                – Draconis
                Mar 6 at 21:04






              • 1





                @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

                – user2357112
                Mar 7 at 0:05















              20














              Use the numpy version, not math



              import numpy as np

              np.log10(df)





              share|improve this answer























              • Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

                – Aleksandar
                Mar 6 at 17:13






              • 1





                (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

                – Christoph Burschka
                Mar 6 at 17:23











              • @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

                – Draconis
                Mar 6 at 21:04






              • 1





                @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

                – user2357112
                Mar 7 at 0:05













              20












              20








              20







              Use the numpy version, not math



              import numpy as np

              np.log10(df)





              share|improve this answer













              Use the numpy version, not math



              import numpy as np

              np.log10(df)






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Mar 6 at 13:44









              ecortazarecortazar

              9018




              9018












              • Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

                – Aleksandar
                Mar 6 at 17:13






              • 1





                (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

                – Christoph Burschka
                Mar 6 at 17:23











              • @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

                – Draconis
                Mar 6 at 21:04






              • 1





                @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

                – user2357112
                Mar 7 at 0:05

















              • Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

                – Aleksandar
                Mar 6 at 17:13






              • 1





                (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

                – Christoph Burschka
                Mar 6 at 17:23











              • @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

                – Draconis
                Mar 6 at 21:04






              • 1





                @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

                – user2357112
                Mar 7 at 0:05
















              Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

              – Aleksandar
              Mar 6 at 17:13





              Thanks my friend!!! Do you have any idea what to do if some values in pandas dataframe are 0? Then, I cant use log function

              – Aleksandar
              Mar 6 at 17:13




              1




              1





              (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

              – Christoph Burschka
              Mar 6 at 17:23





              (Note that if numpy has no equivalent of the function you want, you can also use np.vectorize(function) to turn any scalar function into a vector function.)

              – Christoph Burschka
              Mar 6 at 17:23













              @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

              – Draconis
              Mar 6 at 21:04





              @Aleksandar At that point, you'll have to decide what you want to happen to the zeros. Numpy can handle whatever you choose without difficulty.

              – Draconis
              Mar 6 at 21:04




              1




              1





              @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

              – user2357112
              Mar 7 at 0:05





              @ChristophBurschka: But if you do that, it's going to be way slower than a "natively" vectorized function, as well as producing silently wrong results if you aren't careful about having consistent output dtypes.

              – user2357112
              Mar 7 at 0:05













              12














              From what it seems math.log10 cannot handle neither pandas dataframes nor ndarrays.



              So one option would be to go with numpy, which also includes a function to compute the base 10 logarithm, np.log10, and reconstruct the dataframe as pointed out in other solutions.



              Or if you want to go with math.log10, and the same would apply to other functions that cannot be directly vectorized, you can use DataFrame.applymap to apply math.log10 to the dataframe elementwise. Do note however that this solution will be slower than a vectorized approach using np.log10.




              Use case



              Here's an example of how this could be done using DataFrame.applymap:



              df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))

              print(df)
              a b c d e f
              0 3 4 1 1 2 1
              1 4 4 4 3 4 1
              2 4 3 3 1 4 1
              3 3 4 1 3 1 1
              4 1 2 3 4 2 1
              5 1 3 3 1 4 3

              df.applymap(math.log10)

              a b c d e f
              0 0.477121 0.602060 0.000000 0.000000 0.30103 0.000000
              1 0.602060 0.602060 0.602060 0.477121 0.60206 0.000000
              2 0.602060 0.477121 0.477121 0.000000 0.60206 0.000000
              3 0.477121 0.602060 0.000000 0.477121 0.00000 0.000000
              4 0.000000 0.301030 0.477121 0.602060 0.30103 0.000000
              5 0.000000 0.477121 0.477121 0.000000 0.60206 0.477121



              For the numpy solution, you could take the np.log10 of the dataframe, and reconstruct it as:



              pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)





              share|improve this answer





























                12














                From what it seems math.log10 cannot handle neither pandas dataframes nor ndarrays.



                So one option would be to go with numpy, which also includes a function to compute the base 10 logarithm, np.log10, and reconstruct the dataframe as pointed out in other solutions.



                Or if you want to go with math.log10, and the same would apply to other functions that cannot be directly vectorized, you can use DataFrame.applymap to apply math.log10 to the dataframe elementwise. Do note however that this solution will be slower than a vectorized approach using np.log10.




                Use case



                Here's an example of how this could be done using DataFrame.applymap:



                df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))

                print(df)
                a b c d e f
                0 3 4 1 1 2 1
                1 4 4 4 3 4 1
                2 4 3 3 1 4 1
                3 3 4 1 3 1 1
                4 1 2 3 4 2 1
                5 1 3 3 1 4 3

                df.applymap(math.log10)

                a b c d e f
                0 0.477121 0.602060 0.000000 0.000000 0.30103 0.000000
                1 0.602060 0.602060 0.602060 0.477121 0.60206 0.000000
                2 0.602060 0.477121 0.477121 0.000000 0.60206 0.000000
                3 0.477121 0.602060 0.000000 0.477121 0.00000 0.000000
                4 0.000000 0.301030 0.477121 0.602060 0.30103 0.000000
                5 0.000000 0.477121 0.477121 0.000000 0.60206 0.477121



                For the numpy solution, you could take the np.log10 of the dataframe, and reconstruct it as:



                pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)





                share|improve this answer



























                  12












                  12








                  12







                  From what it seems math.log10 cannot handle neither pandas dataframes nor ndarrays.



                  So one option would be to go with numpy, which also includes a function to compute the base 10 logarithm, np.log10, and reconstruct the dataframe as pointed out in other solutions.



                  Or if you want to go with math.log10, and the same would apply to other functions that cannot be directly vectorized, you can use DataFrame.applymap to apply math.log10 to the dataframe elementwise. Do note however that this solution will be slower than a vectorized approach using np.log10.




                  Use case



                  Here's an example of how this could be done using DataFrame.applymap:



                  df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))

                  print(df)
                  a b c d e f
                  0 3 4 1 1 2 1
                  1 4 4 4 3 4 1
                  2 4 3 3 1 4 1
                  3 3 4 1 3 1 1
                  4 1 2 3 4 2 1
                  5 1 3 3 1 4 3

                  df.applymap(math.log10)

                  a b c d e f
                  0 0.477121 0.602060 0.000000 0.000000 0.30103 0.000000
                  1 0.602060 0.602060 0.602060 0.477121 0.60206 0.000000
                  2 0.602060 0.477121 0.477121 0.000000 0.60206 0.000000
                  3 0.477121 0.602060 0.000000 0.477121 0.00000 0.000000
                  4 0.000000 0.301030 0.477121 0.602060 0.30103 0.000000
                  5 0.000000 0.477121 0.477121 0.000000 0.60206 0.477121



                  For the numpy solution, you could take the np.log10 of the dataframe, and reconstruct it as:



                  pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)





                  share|improve this answer















                  From what it seems math.log10 cannot handle neither pandas dataframes nor ndarrays.



                  So one option would be to go with numpy, which also includes a function to compute the base 10 logarithm, np.log10, and reconstruct the dataframe as pointed out in other solutions.



                  Or if you want to go with math.log10, and the same would apply to other functions that cannot be directly vectorized, you can use DataFrame.applymap to apply math.log10 to the dataframe elementwise. Do note however that this solution will be slower than a vectorized approach using np.log10.




                  Use case



                  Here's an example of how this could be done using DataFrame.applymap:



                  df = pd.DataFrame(np.random.randint(1,5,(6,6)), columns=list('abcdef'))

                  print(df)
                  a b c d e f
                  0 3 4 1 1 2 1
                  1 4 4 4 3 4 1
                  2 4 3 3 1 4 1
                  3 3 4 1 3 1 1
                  4 1 2 3 4 2 1
                  5 1 3 3 1 4 3

                  df.applymap(math.log10)

                  a b c d e f
                  0 0.477121 0.602060 0.000000 0.000000 0.30103 0.000000
                  1 0.602060 0.602060 0.602060 0.477121 0.60206 0.000000
                  2 0.602060 0.477121 0.477121 0.000000 0.60206 0.000000
                  3 0.477121 0.602060 0.000000 0.477121 0.00000 0.000000
                  4 0.000000 0.301030 0.477121 0.602060 0.30103 0.000000
                  5 0.000000 0.477121 0.477121 0.000000 0.60206 0.477121



                  For the numpy solution, you could take the np.log10 of the dataframe, and reconstruct it as:



                  pd.DataFrame(np.log10(data), index=df.index, columns=df.columns)






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Mar 6 at 16:41

























                  answered Mar 6 at 13:44









                  yatuyatu

                  15.6k41542




                  15.6k41542





















                      4














                      You may want to use the applymap method to apply math.log10 on the whole dataframe, here is the documentation.



                      You can test it:



                      df.applymap(math.log10)





                      share|improve this answer





























                        4














                        You may want to use the applymap method to apply math.log10 on the whole dataframe, here is the documentation.



                        You can test it:



                        df.applymap(math.log10)





                        share|improve this answer



























                          4












                          4








                          4







                          You may want to use the applymap method to apply math.log10 on the whole dataframe, here is the documentation.



                          You can test it:



                          df.applymap(math.log10)





                          share|improve this answer















                          You may want to use the applymap method to apply math.log10 on the whole dataframe, here is the documentation.



                          You can test it:



                          df.applymap(math.log10)






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Mar 6 at 14:16









                          IanS

                          8,75232864




                          8,75232864










                          answered Mar 6 at 13:45









                          Valentin MercierValentin Mercier

                          10710




                          10710



























                              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%2f55024529%2fhow-to-use-math-log10-function-on-whole-pandas-dataframe%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

                              How to check contact read email or not when send email to Individual?

                              Bahrain

                              Postfix configuration issue with fips on centos 7; mailgun relay