Pandas DataFrames: Create new rows with calculations across existing rows The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceDynamic Expression Evaluation in pandas using pd.eval()Add one row to pandas DataFrameSelecting multiple columns in a pandas dataframeAdding new column to existing DataFrame in Python pandasDelete column from pandas DataFrame by column nameHow to drop rows of Pandas DataFrame whose value in certain columns is NaN“Large data” work flows using pandasHow do I get the row count of a pandas DataFrame?How to iterate over rows in a DataFrame in Pandas?Select rows from a DataFrame based on values in a column in pandasGet list from pandas DataFrame column headers

How are presidential pardons supposed to be used?

Program that generates brainfuck code that outputs given text

Is there a trick to getting spices to fix to nuts?

Wolves and sheep

Was credit for the black hole image misattributed?

How to colour the US map with Yellow, Green, Red and Blue to minimize the number of states with the colour of Green

How to make `trap` know if the EXIT is after successful program finish or because of premature as an error or something

Why does this iterative way of solving of equation work?

Make it rain characters

How long does the line of fire that you can create as an action using the Investiture of Flame spell last?

What can I do if neighbor is blocking my solar panels intentionally?

When did F become S in typeography, and why?

Why can't devices on different VLANs, but on the same subnet, communicate?

What aspect of planet Earth must be changed to prevent the industrial revolution?

Take groceries in checked luggage

How do you keep chess fun when your opponent constantly beats you?

Derivation tree not rendering

I'm thinking of a number

Is it ok to offer lower paid work as a trial period before negotiating for a full-time job?

Difference between "generating set" and free product?

Is above average number of years spent on PhD considered a red flag in future academia or industry positions?

Why is Captain Marvel translated as male in Portugal?

In horse breeding, what is the female equivalent of putting a horse out "to stud"?

What does the torsion-free condition for a connection mean in terms of its horizontal bundle?



Pandas DataFrames: Create new rows with calculations across existing rows



The 2019 Stack Overflow Developer Survey Results Are In
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)
The Ask Question Wizard is Live!
Data science time! April 2019 and salary with experienceDynamic Expression Evaluation in pandas using pd.eval()Add one row to pandas DataFrameSelecting multiple columns in a pandas dataframeAdding new column to existing DataFrame in Python pandasDelete column from pandas DataFrame by column nameHow to drop rows of Pandas DataFrame whose value in certain columns is NaN“Large data” work flows using pandasHow do I get the row count of a pandas DataFrame?How to iterate over rows in a DataFrame in Pandas?Select rows from a DataFrame based on values in a column in pandasGet list from pandas DataFrame column headers



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








6















How can I create new rows from an existing DataFrame by grouping by certain fields (in the example "Country" and "Industry") and applying some math to another field (in the example "Field" and "Value")?



Source DataFrame



df = pd.DataFrame('Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
'Industry': ['Finance', 'Finance', 'Retail',
'Retail', 'Energy', 'Energy',
'Retail', 'Retail'],
'Field': ['Import', 'Export','Import',
'Export','Import', 'Export',
'Import', 'Export'],
'Value': [100, 50, 80, 10, 20, 5, 30, 10])

Country Industry Field Value
0 USA Finance Import 100
1 USA Finance Export 50
2 USA Retail Import 80
3 USA Retail Export 10
4 USA Energy Import 20
5 USA Energy Export 5
6 Canada Retail Import 30
7 Canada Retail Export 10


Target DataFrame



Net = Import - Export



 Country Industry Field Value
0 USA Finance Net 50
1 USA Retail Net 70
2 USA Energy Net 15
3 Canada Retail Net 20









share|improve this question






























    6















    How can I create new rows from an existing DataFrame by grouping by certain fields (in the example "Country" and "Industry") and applying some math to another field (in the example "Field" and "Value")?



    Source DataFrame



    df = pd.DataFrame('Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
    'Industry': ['Finance', 'Finance', 'Retail',
    'Retail', 'Energy', 'Energy',
    'Retail', 'Retail'],
    'Field': ['Import', 'Export','Import',
    'Export','Import', 'Export',
    'Import', 'Export'],
    'Value': [100, 50, 80, 10, 20, 5, 30, 10])

    Country Industry Field Value
    0 USA Finance Import 100
    1 USA Finance Export 50
    2 USA Retail Import 80
    3 USA Retail Export 10
    4 USA Energy Import 20
    5 USA Energy Export 5
    6 Canada Retail Import 30
    7 Canada Retail Export 10


    Target DataFrame



    Net = Import - Export



     Country Industry Field Value
    0 USA Finance Net 50
    1 USA Retail Net 70
    2 USA Energy Net 15
    3 Canada Retail Net 20









    share|improve this question


























      6












      6








      6








      How can I create new rows from an existing DataFrame by grouping by certain fields (in the example "Country" and "Industry") and applying some math to another field (in the example "Field" and "Value")?



      Source DataFrame



      df = pd.DataFrame('Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
      'Industry': ['Finance', 'Finance', 'Retail',
      'Retail', 'Energy', 'Energy',
      'Retail', 'Retail'],
      'Field': ['Import', 'Export','Import',
      'Export','Import', 'Export',
      'Import', 'Export'],
      'Value': [100, 50, 80, 10, 20, 5, 30, 10])

      Country Industry Field Value
      0 USA Finance Import 100
      1 USA Finance Export 50
      2 USA Retail Import 80
      3 USA Retail Export 10
      4 USA Energy Import 20
      5 USA Energy Export 5
      6 Canada Retail Import 30
      7 Canada Retail Export 10


      Target DataFrame



      Net = Import - Export



       Country Industry Field Value
      0 USA Finance Net 50
      1 USA Retail Net 70
      2 USA Energy Net 15
      3 Canada Retail Net 20









      share|improve this question
















      How can I create new rows from an existing DataFrame by grouping by certain fields (in the example "Country" and "Industry") and applying some math to another field (in the example "Field" and "Value")?



      Source DataFrame



      df = pd.DataFrame('Country': ['USA','USA','USA','USA','USA','USA','Canada','Canada'],
      'Industry': ['Finance', 'Finance', 'Retail',
      'Retail', 'Energy', 'Energy',
      'Retail', 'Retail'],
      'Field': ['Import', 'Export','Import',
      'Export','Import', 'Export',
      'Import', 'Export'],
      'Value': [100, 50, 80, 10, 20, 5, 30, 10])

      Country Industry Field Value
      0 USA Finance Import 100
      1 USA Finance Export 50
      2 USA Retail Import 80
      3 USA Retail Export 10
      4 USA Energy Import 20
      5 USA Energy Export 5
      6 Canada Retail Import 30
      7 Canada Retail Export 10


      Target DataFrame



      Net = Import - Export



       Country Industry Field Value
      0 USA Finance Net 50
      1 USA Retail Net 70
      2 USA Energy Net 15
      3 Canada Retail Net 20






      python pandas dataframe






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 8 hours ago









      Scott Boston

      58.6k73258




      58.6k73258










      asked 8 hours ago









      LorenzLorenz

      595




      595






















          5 Answers
          5






          active

          oldest

          votes


















          8














          There are quite possibly many ways. Here's one using groupby and unstack:



          (df.groupby(['Country', 'Industry', 'Field'], sort=False)['Value']
          .sum()
          .unstack('Field')
          .eval('Import - Export')
          .reset_index(name='Value'))

          Country Industry Value
          0 USA Finance 50
          1 USA Retail 70
          2 USA Energy 15
          3 Canada Retail 20





          share|improve this answer




















          • 1





            By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

            – BallpointBen
            8 hours ago






          • 1





            @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

            – coldspeed
            8 hours ago











          • Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

            – Lorenz
            5 hours ago











          • @Lorenz Oops... fixed, thanks!

            – coldspeed
            5 hours ago











          • @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

            – BallpointBen
            3 hours ago


















          4














          IIUC



          df=df.set_index(['Country','Industry'])

          Newdf=(df.loc[df.Field=='Export','Value']-df.loc[df.Field=='Import','Value']).reset_index().assign(Field='Net')
          Newdf
          Country Industry Value Field
          0 USA Finance -50 Net
          1 USA Retail -70 Net
          2 USA Energy -15 Net
          3 Canada Retail -20 Net



          pivot_table



          df.pivot_table(index=['Country','Industry'],columns='Field',values='Value',aggfunc='sum').
          diff(axis=1).
          dropna(1).
          rename(columns='Import':'Value').
          reset_index()
          Out[112]:
          Field Country Industry Value
          0 Canada Retail 20.0
          1 USA Energy 15.0
          2 USA Finance 50.0
          3 USA Retail 70.0





          share|improve this answer
































            2














            You can use Groupby.diff() and after that recreate the Field column and finally use DataFrame.dropna:



            df['Value'] = df.groupby(['Country', 'Industry'])['Value'].diff().abs()
            df['Field'] = 'Net'
            df.dropna(inplace=True)
            df.reset_index(drop=True, inplace=True)

            print(df)
            Country Industry Field Value
            0 USA Finance Net 50.0
            1 USA Retail Net 70.0
            2 USA Energy Net 15.0
            3 Canada Retail Net 20.0





            share|improve this answer






























              2














              You can do it this way to add those rows to your original dataframe:



              df.set_index(['Country','Industry','Field'])
              .unstack()['Value']
              .eval('Net = Import - Export')
              .stack().rename('Value').reset_index()


              Output:



               Country Industry Field Value
              0 Canada Retail Export 10
              1 Canada Retail Import 30
              2 Canada Retail Net 20
              3 USA Energy Export 5
              4 USA Energy Import 20
              5 USA Energy Net 15
              6 USA Finance Export 50
              7 USA Finance Import 100
              8 USA Finance Net 50
              9 USA Retail Export 10
              10 USA Retail Import 80
              11 USA Retail Net 70





              share|improve this answer























              • Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                – Lorenz
                5 hours ago






              • 1





                Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                – Lorenz
                3 hours ago


















              1














              This answer takes advantage of the fact that pandas puts the group keys in the multiindex of the resulting dataframe. (If there were only one group key, you could use loc.)



              >>> s = df.groupby(['Country', 'Industry', 'Field'])['Value'].sum()
              >>> s.xs('Import', axis=0, level='Field') - s.xs('Export', axis=0, level='Field')
              Country Industry
              Canada Retail 20
              USA Energy 15
              Finance 50
              Retail 70
              Name: Value, dtype: int64





              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%2f55670192%2fpandas-dataframes-create-new-rows-with-calculations-across-existing-rows%23new-answer', 'question_page');

                );

                Post as a guest















                Required, but never shown

























                5 Answers
                5






                active

                oldest

                votes








                5 Answers
                5






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                8














                There are quite possibly many ways. Here's one using groupby and unstack:



                (df.groupby(['Country', 'Industry', 'Field'], sort=False)['Value']
                .sum()
                .unstack('Field')
                .eval('Import - Export')
                .reset_index(name='Value'))

                Country Industry Value
                0 USA Finance 50
                1 USA Retail 70
                2 USA Energy 15
                3 Canada Retail 20





                share|improve this answer




















                • 1





                  By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                  – BallpointBen
                  8 hours ago






                • 1





                  @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                  – coldspeed
                  8 hours ago











                • Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                  – Lorenz
                  5 hours ago











                • @Lorenz Oops... fixed, thanks!

                  – coldspeed
                  5 hours ago











                • @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                  – BallpointBen
                  3 hours ago















                8














                There are quite possibly many ways. Here's one using groupby and unstack:



                (df.groupby(['Country', 'Industry', 'Field'], sort=False)['Value']
                .sum()
                .unstack('Field')
                .eval('Import - Export')
                .reset_index(name='Value'))

                Country Industry Value
                0 USA Finance 50
                1 USA Retail 70
                2 USA Energy 15
                3 Canada Retail 20





                share|improve this answer




















                • 1





                  By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                  – BallpointBen
                  8 hours ago






                • 1





                  @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                  – coldspeed
                  8 hours ago











                • Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                  – Lorenz
                  5 hours ago











                • @Lorenz Oops... fixed, thanks!

                  – coldspeed
                  5 hours ago











                • @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                  – BallpointBen
                  3 hours ago













                8












                8








                8







                There are quite possibly many ways. Here's one using groupby and unstack:



                (df.groupby(['Country', 'Industry', 'Field'], sort=False)['Value']
                .sum()
                .unstack('Field')
                .eval('Import - Export')
                .reset_index(name='Value'))

                Country Industry Value
                0 USA Finance 50
                1 USA Retail 70
                2 USA Energy 15
                3 Canada Retail 20





                share|improve this answer















                There are quite possibly many ways. Here's one using groupby and unstack:



                (df.groupby(['Country', 'Industry', 'Field'], sort=False)['Value']
                .sum()
                .unstack('Field')
                .eval('Import - Export')
                .reset_index(name='Value'))

                Country Industry Value
                0 USA Finance 50
                1 USA Retail 70
                2 USA Energy 15
                3 Canada Retail 20






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited 5 hours ago

























                answered 8 hours ago









                coldspeedcoldspeed

                142k25159247




                142k25159247







                • 1





                  By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                  – BallpointBen
                  8 hours ago






                • 1





                  @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                  – coldspeed
                  8 hours ago











                • Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                  – Lorenz
                  5 hours ago











                • @Lorenz Oops... fixed, thanks!

                  – coldspeed
                  5 hours ago











                • @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                  – BallpointBen
                  3 hours ago












                • 1





                  By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                  – BallpointBen
                  8 hours ago






                • 1





                  @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                  – coldspeed
                  8 hours ago











                • Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                  – Lorenz
                  5 hours ago











                • @Lorenz Oops... fixed, thanks!

                  – coldspeed
                  5 hours ago











                • @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                  – BallpointBen
                  3 hours ago







                1




                1





                By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                – BallpointBen
                8 hours ago





                By far the best answer. The unstack followed by eval is a really nice trick — better than a second groupby and get_group I would have done

                – BallpointBen
                8 hours ago




                1




                1





                @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                – coldspeed
                8 hours ago





                @BallpointBen eval and query are personal favourites of mine from the API. I've made attempts to popularise their use, but their usage is not completely understood. I have a QnA here, if you are interested.

                – coldspeed
                8 hours ago













                Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                – Lorenz
                5 hours ago





                Works like a charm. Thank you very much. Very small comment - there is a closing bracket missing in the last line.

                – Lorenz
                5 hours ago













                @Lorenz Oops... fixed, thanks!

                – coldspeed
                5 hours ago





                @Lorenz Oops... fixed, thanks!

                – coldspeed
                5 hours ago













                @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                – BallpointBen
                3 hours ago





                @coldspeed Actually I think there’s a better way… see my answer. unstack is expensive because it reshapes. Using the structure of the first groupby is more efficient, although it takes two lines.

                – BallpointBen
                3 hours ago













                4














                IIUC



                df=df.set_index(['Country','Industry'])

                Newdf=(df.loc[df.Field=='Export','Value']-df.loc[df.Field=='Import','Value']).reset_index().assign(Field='Net')
                Newdf
                Country Industry Value Field
                0 USA Finance -50 Net
                1 USA Retail -70 Net
                2 USA Energy -15 Net
                3 Canada Retail -20 Net



                pivot_table



                df.pivot_table(index=['Country','Industry'],columns='Field',values='Value',aggfunc='sum').
                diff(axis=1).
                dropna(1).
                rename(columns='Import':'Value').
                reset_index()
                Out[112]:
                Field Country Industry Value
                0 Canada Retail 20.0
                1 USA Energy 15.0
                2 USA Finance 50.0
                3 USA Retail 70.0





                share|improve this answer





























                  4














                  IIUC



                  df=df.set_index(['Country','Industry'])

                  Newdf=(df.loc[df.Field=='Export','Value']-df.loc[df.Field=='Import','Value']).reset_index().assign(Field='Net')
                  Newdf
                  Country Industry Value Field
                  0 USA Finance -50 Net
                  1 USA Retail -70 Net
                  2 USA Energy -15 Net
                  3 Canada Retail -20 Net



                  pivot_table



                  df.pivot_table(index=['Country','Industry'],columns='Field',values='Value',aggfunc='sum').
                  diff(axis=1).
                  dropna(1).
                  rename(columns='Import':'Value').
                  reset_index()
                  Out[112]:
                  Field Country Industry Value
                  0 Canada Retail 20.0
                  1 USA Energy 15.0
                  2 USA Finance 50.0
                  3 USA Retail 70.0





                  share|improve this answer



























                    4












                    4








                    4







                    IIUC



                    df=df.set_index(['Country','Industry'])

                    Newdf=(df.loc[df.Field=='Export','Value']-df.loc[df.Field=='Import','Value']).reset_index().assign(Field='Net')
                    Newdf
                    Country Industry Value Field
                    0 USA Finance -50 Net
                    1 USA Retail -70 Net
                    2 USA Energy -15 Net
                    3 Canada Retail -20 Net



                    pivot_table



                    df.pivot_table(index=['Country','Industry'],columns='Field',values='Value',aggfunc='sum').
                    diff(axis=1).
                    dropna(1).
                    rename(columns='Import':'Value').
                    reset_index()
                    Out[112]:
                    Field Country Industry Value
                    0 Canada Retail 20.0
                    1 USA Energy 15.0
                    2 USA Finance 50.0
                    3 USA Retail 70.0





                    share|improve this answer















                    IIUC



                    df=df.set_index(['Country','Industry'])

                    Newdf=(df.loc[df.Field=='Export','Value']-df.loc[df.Field=='Import','Value']).reset_index().assign(Field='Net')
                    Newdf
                    Country Industry Value Field
                    0 USA Finance -50 Net
                    1 USA Retail -70 Net
                    2 USA Energy -15 Net
                    3 Canada Retail -20 Net



                    pivot_table



                    df.pivot_table(index=['Country','Industry'],columns='Field',values='Value',aggfunc='sum').
                    diff(axis=1).
                    dropna(1).
                    rename(columns='Import':'Value').
                    reset_index()
                    Out[112]:
                    Field Country Industry Value
                    0 Canada Retail 20.0
                    1 USA Energy 15.0
                    2 USA Finance 50.0
                    3 USA Retail 70.0






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited 7 hours ago

























                    answered 8 hours ago









                    Wen-BenWen-Ben

                    125k83871




                    125k83871





















                        2














                        You can use Groupby.diff() and after that recreate the Field column and finally use DataFrame.dropna:



                        df['Value'] = df.groupby(['Country', 'Industry'])['Value'].diff().abs()
                        df['Field'] = 'Net'
                        df.dropna(inplace=True)
                        df.reset_index(drop=True, inplace=True)

                        print(df)
                        Country Industry Field Value
                        0 USA Finance Net 50.0
                        1 USA Retail Net 70.0
                        2 USA Energy Net 15.0
                        3 Canada Retail Net 20.0





                        share|improve this answer



























                          2














                          You can use Groupby.diff() and after that recreate the Field column and finally use DataFrame.dropna:



                          df['Value'] = df.groupby(['Country', 'Industry'])['Value'].diff().abs()
                          df['Field'] = 'Net'
                          df.dropna(inplace=True)
                          df.reset_index(drop=True, inplace=True)

                          print(df)
                          Country Industry Field Value
                          0 USA Finance Net 50.0
                          1 USA Retail Net 70.0
                          2 USA Energy Net 15.0
                          3 Canada Retail Net 20.0





                          share|improve this answer

























                            2












                            2








                            2







                            You can use Groupby.diff() and after that recreate the Field column and finally use DataFrame.dropna:



                            df['Value'] = df.groupby(['Country', 'Industry'])['Value'].diff().abs()
                            df['Field'] = 'Net'
                            df.dropna(inplace=True)
                            df.reset_index(drop=True, inplace=True)

                            print(df)
                            Country Industry Field Value
                            0 USA Finance Net 50.0
                            1 USA Retail Net 70.0
                            2 USA Energy Net 15.0
                            3 Canada Retail Net 20.0





                            share|improve this answer













                            You can use Groupby.diff() and after that recreate the Field column and finally use DataFrame.dropna:



                            df['Value'] = df.groupby(['Country', 'Industry'])['Value'].diff().abs()
                            df['Field'] = 'Net'
                            df.dropna(inplace=True)
                            df.reset_index(drop=True, inplace=True)

                            print(df)
                            Country Industry Field Value
                            0 USA Finance Net 50.0
                            1 USA Retail Net 70.0
                            2 USA Energy Net 15.0
                            3 Canada Retail Net 20.0






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 8 hours ago









                            ErfanErfan

                            3,2111419




                            3,2111419





















                                2














                                You can do it this way to add those rows to your original dataframe:



                                df.set_index(['Country','Industry','Field'])
                                .unstack()['Value']
                                .eval('Net = Import - Export')
                                .stack().rename('Value').reset_index()


                                Output:



                                 Country Industry Field Value
                                0 Canada Retail Export 10
                                1 Canada Retail Import 30
                                2 Canada Retail Net 20
                                3 USA Energy Export 5
                                4 USA Energy Import 20
                                5 USA Energy Net 15
                                6 USA Finance Export 50
                                7 USA Finance Import 100
                                8 USA Finance Net 50
                                9 USA Retail Export 10
                                10 USA Retail Import 80
                                11 USA Retail Net 70





                                share|improve this answer























                                • Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                  – Lorenz
                                  5 hours ago






                                • 1





                                  Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                  – Lorenz
                                  3 hours ago















                                2














                                You can do it this way to add those rows to your original dataframe:



                                df.set_index(['Country','Industry','Field'])
                                .unstack()['Value']
                                .eval('Net = Import - Export')
                                .stack().rename('Value').reset_index()


                                Output:



                                 Country Industry Field Value
                                0 Canada Retail Export 10
                                1 Canada Retail Import 30
                                2 Canada Retail Net 20
                                3 USA Energy Export 5
                                4 USA Energy Import 20
                                5 USA Energy Net 15
                                6 USA Finance Export 50
                                7 USA Finance Import 100
                                8 USA Finance Net 50
                                9 USA Retail Export 10
                                10 USA Retail Import 80
                                11 USA Retail Net 70





                                share|improve this answer























                                • Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                  – Lorenz
                                  5 hours ago






                                • 1





                                  Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                  – Lorenz
                                  3 hours ago













                                2












                                2








                                2







                                You can do it this way to add those rows to your original dataframe:



                                df.set_index(['Country','Industry','Field'])
                                .unstack()['Value']
                                .eval('Net = Import - Export')
                                .stack().rename('Value').reset_index()


                                Output:



                                 Country Industry Field Value
                                0 Canada Retail Export 10
                                1 Canada Retail Import 30
                                2 Canada Retail Net 20
                                3 USA Energy Export 5
                                4 USA Energy Import 20
                                5 USA Energy Net 15
                                6 USA Finance Export 50
                                7 USA Finance Import 100
                                8 USA Finance Net 50
                                9 USA Retail Export 10
                                10 USA Retail Import 80
                                11 USA Retail Net 70





                                share|improve this answer













                                You can do it this way to add those rows to your original dataframe:



                                df.set_index(['Country','Industry','Field'])
                                .unstack()['Value']
                                .eval('Net = Import - Export')
                                .stack().rename('Value').reset_index()


                                Output:



                                 Country Industry Field Value
                                0 Canada Retail Export 10
                                1 Canada Retail Import 30
                                2 Canada Retail Net 20
                                3 USA Energy Export 5
                                4 USA Energy Import 20
                                5 USA Energy Net 15
                                6 USA Finance Export 50
                                7 USA Finance Import 100
                                8 USA Finance Net 50
                                9 USA Retail Export 10
                                10 USA Retail Import 80
                                11 USA Retail Net 70






                                share|improve this answer












                                share|improve this answer



                                share|improve this answer










                                answered 8 hours ago









                                Scott BostonScott Boston

                                58.6k73258




                                58.6k73258












                                • Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                  – Lorenz
                                  5 hours ago






                                • 1





                                  Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                  – Lorenz
                                  3 hours ago

















                                • Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                  – Lorenz
                                  5 hours ago






                                • 1





                                  Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                  – Lorenz
                                  3 hours ago
















                                Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                – Lorenz
                                5 hours ago





                                Thanks - actually, I wanted to append it to the original df. So, nice trick to do this all in one command,

                                – Lorenz
                                5 hours ago




                                1




                                1





                                Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                – Lorenz
                                3 hours ago





                                Coldspeed‘s answer was a slight better fit to my overall code. Took from your code how you appended the result to the original df. Very tight result, though. Pitty that i can not accept two answers. But thanks again!

                                – Lorenz
                                3 hours ago











                                1














                                This answer takes advantage of the fact that pandas puts the group keys in the multiindex of the resulting dataframe. (If there were only one group key, you could use loc.)



                                >>> s = df.groupby(['Country', 'Industry', 'Field'])['Value'].sum()
                                >>> s.xs('Import', axis=0, level='Field') - s.xs('Export', axis=0, level='Field')
                                Country Industry
                                Canada Retail 20
                                USA Energy 15
                                Finance 50
                                Retail 70
                                Name: Value, dtype: int64





                                share|improve this answer



























                                  1














                                  This answer takes advantage of the fact that pandas puts the group keys in the multiindex of the resulting dataframe. (If there were only one group key, you could use loc.)



                                  >>> s = df.groupby(['Country', 'Industry', 'Field'])['Value'].sum()
                                  >>> s.xs('Import', axis=0, level='Field') - s.xs('Export', axis=0, level='Field')
                                  Country Industry
                                  Canada Retail 20
                                  USA Energy 15
                                  Finance 50
                                  Retail 70
                                  Name: Value, dtype: int64





                                  share|improve this answer

























                                    1












                                    1








                                    1







                                    This answer takes advantage of the fact that pandas puts the group keys in the multiindex of the resulting dataframe. (If there were only one group key, you could use loc.)



                                    >>> s = df.groupby(['Country', 'Industry', 'Field'])['Value'].sum()
                                    >>> s.xs('Import', axis=0, level='Field') - s.xs('Export', axis=0, level='Field')
                                    Country Industry
                                    Canada Retail 20
                                    USA Energy 15
                                    Finance 50
                                    Retail 70
                                    Name: Value, dtype: int64





                                    share|improve this answer













                                    This answer takes advantage of the fact that pandas puts the group keys in the multiindex of the resulting dataframe. (If there were only one group key, you could use loc.)



                                    >>> s = df.groupby(['Country', 'Industry', 'Field'])['Value'].sum()
                                    >>> s.xs('Import', axis=0, level='Field') - s.xs('Export', axis=0, level='Field')
                                    Country Industry
                                    Canada Retail 20
                                    USA Energy 15
                                    Finance 50
                                    Retail 70
                                    Name: Value, dtype: int64






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered 3 hours ago









                                    BallpointBenBallpointBen

                                    3,7481639




                                    3,7481639



























                                        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%2f55670192%2fpandas-dataframes-create-new-rows-with-calculations-across-existing-rows%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 create a command for the “strange m” symbol in latex? Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)How do you make your own symbol when Detexify fails?Writing bold small caps with mathpazo packageplus-minus symbol with parenthesis around the minus signGreek character in Beamer document titleHow to create dashed right arrow over symbol?Currency symbol: Turkish LiraDouble prec as a single symbol?Plus Sign Too Big; How to Call adfbullet?Is there a TeX macro for three-legged pi?How do I get my integral-like symbol to align like the integral?How to selectively substitute a letter with another symbol representing the same letterHow do I generate a less than symbol and vertical bar that are the same height?

                                        Българска екзархия Съдържание История | Български екзарси | Вижте също | Външни препратки | Литература | Бележки | НавигацияУстав за управлението на българската екзархия. Цариград, 1870Слово на Ловешкия митрополит Иларион при откриването на Българския народен събор в Цариград на 23. II. 1870 г.Българската правда и гръцката кривда. От С. М. (= Софийски Мелетий). Цариград, 1872Предстоятели на Българската екзархияПодмененият ВеликденИнформационна агенция „Фокус“Димитър Ризов. Българите в техните исторически, етнографически и политически граници (Атлас съдържащ 40 карти). Berlin, Königliche Hoflithographie, Hof-Buch- und -Steindruckerei Wilhelm Greve, 1917Report of the International Commission to Inquire into the Causes and Conduct of the Balkan Wars

                                        Чепеларе Съдържание География | История | Население | Спортни и природни забележителности | Културни и исторически обекти | Религии | Обществени институции | Известни личности | Редовни събития | Галерия | Източници | Литература | Външни препратки | Навигация41°43′23.99″ с. ш. 24°41′09.99″ и. д. / 41.723333° с. ш. 24.686111° и. д.*ЧепелареЧепеларски Linux fest 2002Начало на Зимен сезон 2005/06Национални хайдушки празници „Капитан Петко Войвода“Град ЧепелареЧепеларе – народният ски курортbgrod.orgwww.terranatura.hit.bgСправка за населението на гр. Исперих, общ. Исперих, обл. РазградМузей на родопския карстМузей на спорта и скитеЧепеларебългарскибългарскианглийскитукИстория на градаСки писти в ЧепелареВремето в ЧепелареРадио и телевизия в ЧепелареЧепеларе мами с родопски чар и добри пистиЕвтин туризъм и снежни атракции в ЧепелареМестоположениеИнформация и снимки от музея на родопския карст3D панорами от ЧепелареЧепелареррр