Filter a data-frame and add a new column according to the given conditionAdd new keys to a dictionary?Adding...

Is there an academic word that means "to split hairs over"?

Is this possible when it comes to the relations of P, NP, NP-Hard and NP-Complete?

Would life always name the light from their sun "white"

Substring join or additional table, which is faster?

Was the dragon prowess intentionally downplayed in S08E04?

Will casting a card from the graveyard with Flashback add a quest counter on Pyromancer Ascension?

Are there any sonatas with only two sections?

Why weren't the bells paid heed to in S8E5?

What is this minifig/minidoll (?)

Is 95% of what you read in the financial press “either wrong or irrelevant?”

Under what charges was this character executed in Game of Thrones, The Bells?

Should generated documentation be stored in a Git repository?

Can multiple outlets be directly attached to a single breaker?

How do I adjust encounters to challenge my lycanthrope players without negating their cool new abilities?

Offered a new position but unknown about salary?

Segmentation fault when popping x86 stack

Smooth function that vanishes only on unit cube

Why was my Canon Speedlite 600EX triggering other flashes?

Meaning of "work with shame"

Did galley captains put corks in the mouths of slave rowers to keep them quiet?

How to cope with regret and shame about not fully utilizing opportunities during PhD?

Were any toxic metals used in the International Space Station?

What was the ring Varys took off?

Developers demotivated due to working on same project for more than 2 years



Filter a data-frame and add a new column according to the given condition


Add new keys to a dictionary?Adding new column to existing DataFrame in Python pandas“Large data” work flows using pandasAdd numpy array as column to Pandas data frameConvert Python dict into a dataframeAdd new column in Pandas DataFrame PythonPython: function default input that stands for everythingpython subset data frame by column valueMatch columns and append to data frame, Python 3.6How to pivot a dataframe






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







6















I have a data frame like this



ID      col1           col2 
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15


I want to filter all the 'None' from col1 and add the corresponding col2 value into a new column col3. My output look like this



ID      col1           col2              col3 
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15


Can anyone help me to achieve this.










share|improve this question























  • Is it None or 'None'?

    – user3483203
    6 hours ago











  • oh!!. it's actually 'None'

    – No_body
    6 hours ago


















6















I have a data frame like this



ID      col1           col2 
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15


I want to filter all the 'None' from col1 and add the corresponding col2 value into a new column col3. My output look like this



ID      col1           col2              col3 
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15


Can anyone help me to achieve this.










share|improve this question























  • Is it None or 'None'?

    – user3483203
    6 hours ago











  • oh!!. it's actually 'None'

    – No_body
    6 hours ago














6












6








6








I have a data frame like this



ID      col1           col2 
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15


I want to filter all the 'None' from col1 and add the corresponding col2 value into a new column col3. My output look like this



ID      col1           col2              col3 
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15


Can anyone help me to achieve this.










share|improve this question














I have a data frame like this



ID      col1           col2 
1 Abc street 2017-07-27
1 None 2017-08-17
1 Def street 2018-07-15
1 None 2018-08-13
2 fbg street 2018-01-07
2 None 2018-08-12
2 trf street 2019-01-15


I want to filter all the 'None' from col1 and add the corresponding col2 value into a new column col3. My output look like this



ID      col1           col2              col3 
1 Abc street 2017-07-27 2017-08-17
1 Def street 2018-07-15 2018-08-13
2 fbg street 2018-01-07 2018-08-12
2 trf street 2019-01-15


Can anyone help me to achieve this.







python python-3.x pandas numpy pandas-groupby






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 6 hours ago









No_bodyNo_body

359214




359214













  • Is it None or 'None'?

    – user3483203
    6 hours ago











  • oh!!. it's actually 'None'

    – No_body
    6 hours ago



















  • Is it None or 'None'?

    – user3483203
    6 hours ago











  • oh!!. it's actually 'None'

    – No_body
    6 hours ago

















Is it None or 'None'?

– user3483203
6 hours ago





Is it None or 'None'?

– user3483203
6 hours ago













oh!!. it's actually 'None'

– No_body
6 hours ago





oh!!. it's actually 'None'

– No_body
6 hours ago












5 Answers
5






active

oldest

votes


















6














Today's edition of Over Engineered with Numpy



Though admittedly very little obvious Numpy



i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
k, cols = pd.factorize(df.groupby(i).cumcount())

dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
drigt.values[i, k] = df.col2.values

dleft.join(drigt)

ID col1 col2 col3
0 1 Abc street 2017-07-27 2017-08-17
1 1 Def street 2018-07-15 2018-08-13
2 2 fbg street 2018-01-07 2018-08-12
3 2 trf street 2019-01-15 NaN





share|improve this answer































    5














    Using ffill + pivot_table. This assumes that None follows the proper value, which it appears to from your data.





    u = df.assign(col1=df.col1.replace('None'))
    g = ['ID', 'col1']
    idx = u.groupby(g).cumcount()

    (u.assign(idx=idx)
    .pivot_table(index=g, columns='idx', values='col2', aggfunc='first')
    .reset_index())




    idx   ID        col1           0           1
    0 1 Abc street 2017-07-27 2017-08-17
    1 1 Def street 2018-07-15 2018-08-13
    2 2 fbg street 2018-01-07 2018-08-12
    3 2 trf street 2019-01-15 NaN





    share|improve this answer

































      5














      I am using cumcount with merge



      df1=df.loc[df.col1.ne('None'),:].copy()
      df2=df.loc[df.col1.eq('None'),:].copy()
      df1['Key']=df1.groupby('ID').cumcount()
      df2['Key']=df2.groupby('ID').cumcount()
      df1.merge(df2.drop('col1',1),on=['ID','Key'],how='left')
      Out[816]:
      ID col1 col2_x Key col2_y
      0 1 Abcstreet 2017-07-27 0 2017-08-17
      1 1 Defstreet 2018-07-15 1 2018-08-13
      2 2 fbgstreet 2018-01-07 0 2018-08-12
      3 2 trfstreet 2019-01-15 1 NaN





      share|improve this answer
























      • It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

        – No_body
        5 hours ago



















      3














      Try:



      filters = df['col1'].isna()
      s = df.loc[filters, 'col2'].copy()
      df = df[~filters]
      df['col3'] = s.values




      Edit: as you mentioned, the filter you want is 'None', not None, then:



      filters = df['col1'].eq('None')





      share|improve this answer
























      • Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

        – WeNYoBen
        6 hours ago











      • Agree with @WeNYoBen, its dangerous just to paste the values as a column

        – Erfan
        6 hours ago











      • That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

        – Quang Hoang
        6 hours ago





















      0














      Yet another attempt:



      f=df['col1']=='None'
      c3=df.loc[f].col2.reset_index(drop=True)
      df=df[~f]
      df2=pd.concat([df.reset_index(drop=True),c3], axis=1, ignore_index=True)
      df2.columns=['ID', 'col1', 'col2', 'col3']




         ID        col1        col2        col3
      0 1 Abc street 2017-07-27 2017-08-17
      1 1 Def street 2018-07-15 2018-08-13
      2 2 fbg street 2018-01-07 2018-08-12
      3 2 trf street 2019-01-15 NaN





      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%2f56117560%2ffilter-a-data-frame-and-add-a-new-column-according-to-the-given-condition%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









        6














        Today's edition of Over Engineered with Numpy



        Though admittedly very little obvious Numpy



        i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
        k, cols = pd.factorize(df.groupby(i).cumcount())

        dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
        drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
        drigt.values[i, k] = df.col2.values

        dleft.join(drigt)

        ID col1 col2 col3
        0 1 Abc street 2017-07-27 2017-08-17
        1 1 Def street 2018-07-15 2018-08-13
        2 2 fbg street 2018-01-07 2018-08-12
        3 2 trf street 2019-01-15 NaN





        share|improve this answer




























          6














          Today's edition of Over Engineered with Numpy



          Though admittedly very little obvious Numpy



          i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
          k, cols = pd.factorize(df.groupby(i).cumcount())

          dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
          drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
          drigt.values[i, k] = df.col2.values

          dleft.join(drigt)

          ID col1 col2 col3
          0 1 Abc street 2017-07-27 2017-08-17
          1 1 Def street 2018-07-15 2018-08-13
          2 2 fbg street 2018-01-07 2018-08-12
          3 2 trf street 2019-01-15 NaN





          share|improve this answer


























            6












            6








            6







            Today's edition of Over Engineered with Numpy



            Though admittedly very little obvious Numpy



            i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
            k, cols = pd.factorize(df.groupby(i).cumcount())

            dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
            drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
            drigt.values[i, k] = df.col2.values

            dleft.join(drigt)

            ID col1 col2 col3
            0 1 Abc street 2017-07-27 2017-08-17
            1 1 Def street 2018-07-15 2018-08-13
            2 2 fbg street 2018-01-07 2018-08-12
            3 2 trf street 2019-01-15 NaN





            share|improve this answer













            Today's edition of Over Engineered with Numpy



            Though admittedly very little obvious Numpy



            i, rows = pd.factorize([*zip(df.ID, df.col1.replace('None'))])
            k, cols = pd.factorize(df.groupby(i).cumcount())

            dleft = pd.DataFrame(dict(zip(['ID', 'col1'], zip(*rows))))
            drigt = pd.DataFrame(index=dleft.index, columns=np.arange(len(cols)) + 2).add_prefix('col')
            drigt.values[i, k] = df.col2.values

            dleft.join(drigt)

            ID col1 col2 col3
            0 1 Abc street 2017-07-27 2017-08-17
            1 1 Def street 2018-07-15 2018-08-13
            2 2 fbg street 2018-01-07 2018-08-12
            3 2 trf street 2019-01-15 NaN






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 6 hours ago









            piRSquaredpiRSquared

            163k25166313




            163k25166313

























                5














                Using ffill + pivot_table. This assumes that None follows the proper value, which it appears to from your data.





                u = df.assign(col1=df.col1.replace('None'))
                g = ['ID', 'col1']
                idx = u.groupby(g).cumcount()

                (u.assign(idx=idx)
                .pivot_table(index=g, columns='idx', values='col2', aggfunc='first')
                .reset_index())




                idx   ID        col1           0           1
                0 1 Abc street 2017-07-27 2017-08-17
                1 1 Def street 2018-07-15 2018-08-13
                2 2 fbg street 2018-01-07 2018-08-12
                3 2 trf street 2019-01-15 NaN





                share|improve this answer






























                  5














                  Using ffill + pivot_table. This assumes that None follows the proper value, which it appears to from your data.





                  u = df.assign(col1=df.col1.replace('None'))
                  g = ['ID', 'col1']
                  idx = u.groupby(g).cumcount()

                  (u.assign(idx=idx)
                  .pivot_table(index=g, columns='idx', values='col2', aggfunc='first')
                  .reset_index())




                  idx   ID        col1           0           1
                  0 1 Abc street 2017-07-27 2017-08-17
                  1 1 Def street 2018-07-15 2018-08-13
                  2 2 fbg street 2018-01-07 2018-08-12
                  3 2 trf street 2019-01-15 NaN





                  share|improve this answer




























                    5












                    5








                    5







                    Using ffill + pivot_table. This assumes that None follows the proper value, which it appears to from your data.





                    u = df.assign(col1=df.col1.replace('None'))
                    g = ['ID', 'col1']
                    idx = u.groupby(g).cumcount()

                    (u.assign(idx=idx)
                    .pivot_table(index=g, columns='idx', values='col2', aggfunc='first')
                    .reset_index())




                    idx   ID        col1           0           1
                    0 1 Abc street 2017-07-27 2017-08-17
                    1 1 Def street 2018-07-15 2018-08-13
                    2 2 fbg street 2018-01-07 2018-08-12
                    3 2 trf street 2019-01-15 NaN





                    share|improve this answer















                    Using ffill + pivot_table. This assumes that None follows the proper value, which it appears to from your data.





                    u = df.assign(col1=df.col1.replace('None'))
                    g = ['ID', 'col1']
                    idx = u.groupby(g).cumcount()

                    (u.assign(idx=idx)
                    .pivot_table(index=g, columns='idx', values='col2', aggfunc='first')
                    .reset_index())




                    idx   ID        col1           0           1
                    0 1 Abc street 2017-07-27 2017-08-17
                    1 1 Def street 2018-07-15 2018-08-13
                    2 2 fbg street 2018-01-07 2018-08-12
                    3 2 trf street 2019-01-15 NaN






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited 6 hours ago

























                    answered 6 hours ago









                    user3483203user3483203

                    33.3k83157




                    33.3k83157























                        5














                        I am using cumcount with merge



                        df1=df.loc[df.col1.ne('None'),:].copy()
                        df2=df.loc[df.col1.eq('None'),:].copy()
                        df1['Key']=df1.groupby('ID').cumcount()
                        df2['Key']=df2.groupby('ID').cumcount()
                        df1.merge(df2.drop('col1',1),on=['ID','Key'],how='left')
                        Out[816]:
                        ID col1 col2_x Key col2_y
                        0 1 Abcstreet 2017-07-27 0 2017-08-17
                        1 1 Defstreet 2018-07-15 1 2018-08-13
                        2 2 fbgstreet 2018-01-07 0 2018-08-12
                        3 2 trfstreet 2019-01-15 1 NaN





                        share|improve this answer
























                        • It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                          – No_body
                          5 hours ago
















                        5














                        I am using cumcount with merge



                        df1=df.loc[df.col1.ne('None'),:].copy()
                        df2=df.loc[df.col1.eq('None'),:].copy()
                        df1['Key']=df1.groupby('ID').cumcount()
                        df2['Key']=df2.groupby('ID').cumcount()
                        df1.merge(df2.drop('col1',1),on=['ID','Key'],how='left')
                        Out[816]:
                        ID col1 col2_x Key col2_y
                        0 1 Abcstreet 2017-07-27 0 2017-08-17
                        1 1 Defstreet 2018-07-15 1 2018-08-13
                        2 2 fbgstreet 2018-01-07 0 2018-08-12
                        3 2 trfstreet 2019-01-15 1 NaN





                        share|improve this answer
























                        • It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                          – No_body
                          5 hours ago














                        5












                        5








                        5







                        I am using cumcount with merge



                        df1=df.loc[df.col1.ne('None'),:].copy()
                        df2=df.loc[df.col1.eq('None'),:].copy()
                        df1['Key']=df1.groupby('ID').cumcount()
                        df2['Key']=df2.groupby('ID').cumcount()
                        df1.merge(df2.drop('col1',1),on=['ID','Key'],how='left')
                        Out[816]:
                        ID col1 col2_x Key col2_y
                        0 1 Abcstreet 2017-07-27 0 2017-08-17
                        1 1 Defstreet 2018-07-15 1 2018-08-13
                        2 2 fbgstreet 2018-01-07 0 2018-08-12
                        3 2 trfstreet 2019-01-15 1 NaN





                        share|improve this answer













                        I am using cumcount with merge



                        df1=df.loc[df.col1.ne('None'),:].copy()
                        df2=df.loc[df.col1.eq('None'),:].copy()
                        df1['Key']=df1.groupby('ID').cumcount()
                        df2['Key']=df2.groupby('ID').cumcount()
                        df1.merge(df2.drop('col1',1),on=['ID','Key'],how='left')
                        Out[816]:
                        ID col1 col2_x Key col2_y
                        0 1 Abcstreet 2017-07-27 0 2017-08-17
                        1 1 Defstreet 2018-07-15 1 2018-08-13
                        2 2 fbgstreet 2018-01-07 0 2018-08-12
                        3 2 trfstreet 2019-01-15 1 NaN






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered 6 hours ago









                        WeNYoBenWeNYoBen

                        133k84373




                        133k84373













                        • It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                          – No_body
                          5 hours ago



















                        • It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                          – No_body
                          5 hours ago

















                        It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                        – No_body
                        5 hours ago





                        It's working fine but failing for this condition. When i have ab street 2018-01-07 , bc street 2018-02-08 , None 2018-08-12 , rf street 2019-01-15 . The output coming as ab street 2018-01-07 , 2018-08-12 , bc street 2018-02-08 , rf street 2019-01-15 ... Instead of ab street 2018-01-07 , bc street 2018-02-08 , 2018-08-12 , rf street 2019-01-15 .

                        – No_body
                        5 hours ago











                        3














                        Try:



                        filters = df['col1'].isna()
                        s = df.loc[filters, 'col2'].copy()
                        df = df[~filters]
                        df['col3'] = s.values




                        Edit: as you mentioned, the filter you want is 'None', not None, then:



                        filters = df['col1'].eq('None')





                        share|improve this answer
























                        • Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                          – WeNYoBen
                          6 hours ago











                        • Agree with @WeNYoBen, its dangerous just to paste the values as a column

                          – Erfan
                          6 hours ago











                        • That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                          – Quang Hoang
                          6 hours ago


















                        3














                        Try:



                        filters = df['col1'].isna()
                        s = df.loc[filters, 'col2'].copy()
                        df = df[~filters]
                        df['col3'] = s.values




                        Edit: as you mentioned, the filter you want is 'None', not None, then:



                        filters = df['col1'].eq('None')





                        share|improve this answer
























                        • Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                          – WeNYoBen
                          6 hours ago











                        • Agree with @WeNYoBen, its dangerous just to paste the values as a column

                          – Erfan
                          6 hours ago











                        • That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                          – Quang Hoang
                          6 hours ago
















                        3












                        3








                        3







                        Try:



                        filters = df['col1'].isna()
                        s = df.loc[filters, 'col2'].copy()
                        df = df[~filters]
                        df['col3'] = s.values




                        Edit: as you mentioned, the filter you want is 'None', not None, then:



                        filters = df['col1'].eq('None')





                        share|improve this answer













                        Try:



                        filters = df['col1'].isna()
                        s = df.loc[filters, 'col2'].copy()
                        df = df[~filters]
                        df['col3'] = s.values




                        Edit: as you mentioned, the filter you want is 'None', not None, then:



                        filters = df['col1'].eq('None')






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered 6 hours ago









                        Quang HoangQuang Hoang

                        5,94411021




                        5,94411021













                        • Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                          – WeNYoBen
                          6 hours ago











                        • Agree with @WeNYoBen, its dangerous just to paste the values as a column

                          – Erfan
                          6 hours ago











                        • That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                          – Quang Hoang
                          6 hours ago





















                        • Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                          – WeNYoBen
                          6 hours ago











                        • Agree with @WeNYoBen, its dangerous just to paste the values as a column

                          – Erfan
                          6 hours ago











                        • That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                          – Quang Hoang
                          6 hours ago



















                        Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                        – WeNYoBen
                        6 hours ago





                        Maybe you need to check some edge situation , I thought the ID is the key to assign , if you only assign it by value , ID may mismatch

                        – WeNYoBen
                        6 hours ago













                        Agree with @WeNYoBen, its dangerous just to paste the values as a column

                        – Erfan
                        6 hours ago





                        Agree with @WeNYoBen, its dangerous just to paste the values as a column

                        – Erfan
                        6 hours ago













                        That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                        – Quang Hoang
                        6 hours ago







                        That's true. But the ID column given is not unique-value, so assign on that would fail (I think). Or I need to do a groupby.

                        – Quang Hoang
                        6 hours ago













                        0














                        Yet another attempt:



                        f=df['col1']=='None'
                        c3=df.loc[f].col2.reset_index(drop=True)
                        df=df[~f]
                        df2=pd.concat([df.reset_index(drop=True),c3], axis=1, ignore_index=True)
                        df2.columns=['ID', 'col1', 'col2', 'col3']




                           ID        col1        col2        col3
                        0 1 Abc street 2017-07-27 2017-08-17
                        1 1 Def street 2018-07-15 2018-08-13
                        2 2 fbg street 2018-01-07 2018-08-12
                        3 2 trf street 2019-01-15 NaN





                        share|improve this answer




























                          0














                          Yet another attempt:



                          f=df['col1']=='None'
                          c3=df.loc[f].col2.reset_index(drop=True)
                          df=df[~f]
                          df2=pd.concat([df.reset_index(drop=True),c3], axis=1, ignore_index=True)
                          df2.columns=['ID', 'col1', 'col2', 'col3']




                             ID        col1        col2        col3
                          0 1 Abc street 2017-07-27 2017-08-17
                          1 1 Def street 2018-07-15 2018-08-13
                          2 2 fbg street 2018-01-07 2018-08-12
                          3 2 trf street 2019-01-15 NaN





                          share|improve this answer


























                            0












                            0








                            0







                            Yet another attempt:



                            f=df['col1']=='None'
                            c3=df.loc[f].col2.reset_index(drop=True)
                            df=df[~f]
                            df2=pd.concat([df.reset_index(drop=True),c3], axis=1, ignore_index=True)
                            df2.columns=['ID', 'col1', 'col2', 'col3']




                               ID        col1        col2        col3
                            0 1 Abc street 2017-07-27 2017-08-17
                            1 1 Def street 2018-07-15 2018-08-13
                            2 2 fbg street 2018-01-07 2018-08-12
                            3 2 trf street 2019-01-15 NaN





                            share|improve this answer













                            Yet another attempt:



                            f=df['col1']=='None'
                            c3=df.loc[f].col2.reset_index(drop=True)
                            df=df[~f]
                            df2=pd.concat([df.reset_index(drop=True),c3], axis=1, ignore_index=True)
                            df2.columns=['ID', 'col1', 'col2', 'col3']




                               ID        col1        col2        col3
                            0 1 Abc street 2017-07-27 2017-08-17
                            1 1 Def street 2018-07-15 2018-08-13
                            2 2 fbg street 2018-01-07 2018-08-12
                            3 2 trf street 2019-01-15 NaN






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 5 hours ago









                            prostiprosti

                            6,86913241




                            6,86913241






























                                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%2f56117560%2ffilter-a-data-frame-and-add-a-new-column-according-to-the-given-condition%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

                                Hudson River Historic District Contents Geography History The district today Aesthetics Cultural...

                                The number designs the writing. Feandra Aversely Definition: The act of ingrafting a sprig or shoot of one...

                                Ayherre Geografie Demografie Externe links Navigatiemenu43° 23′ NB, 1° 15′ WL43° 23′ NB, 1°...