简体   繁体   中英

Using .loc and shift() to add one to a serialnumber

I'm trying to add two dataframes using concat with axis = 0, so the columns stay the same but the index increases. One of the dataframes contains a specific columns with a serial number (going from one upwards - but not necessarily in sequence eg. 1,2,3,4,5, etc.)

import pandas as pd
import numpy as np

a = pd.DataFrame(data = {'Name': ['A', 'B','C'],
        'Serial Number': [1, 2,5]} )
b = pd.DataFrame(data = {'Name': ['D','E','F'],
        'Serial Number': [np.nan,np.nan,np.nan]})

c = pd.concat([a,b],axis=0).reset_index()

I would like to have column 'Serial Number' in dataframe C to start from 5+1 the next one 6+1.

I've tried a variety of things eg:

c.loc[c['B'].isna(), 'B'] = c['B'].shift(1)+1

But it doesn't seem to work.

Desired output:

  | Name | Serial Number|
-------------------------
1   A    |      1
2   B    |      2
3   C    |      5
4   D    |      6
5   E    |      7
6   F    |      8

One idea is create arange by number od missinng values add maximal value and 1 :

a = np.arange(c['Serial Number'].isna().sum()) + c['Serial Number'].max() + 1
c.loc[c['Serial Number'].isna(), 'Serial Number'] = a

print (c)
   index Name  Serial Number
0      0    A            1.0
1      1    B            2.0
2      2    C            5.0
3      0    D            6.0
4      1    E            7.0
5      2    F            8.0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM