Home > Software engineering >  Python pandas move cell value to another cell in same row
Python pandas move cell value to another cell in same row

Time:06-02

I have a dataFrame like this:

id   Description     Price     Unit
1    Test Only       1254       12
2    Data test       Fresher    4
3    Sample          3569       1
4    Sample Onces    Code test 
5    Sample          245        2

I want to move to the left Description column from Price column if not integer then become NaN. I have no specific word to call in or match, the only thing is If Price column have Non-interger value, that string value move to Description column.

I already tried pandas replace and concat but not working.

Desire output like this:

id   Description     Price     Unit
1    Test Only       1254       12
2    Fresher                    4
3    Sample          3569       1
4    Code test     
5    Sample          245        2

CodePudding user response:

This should work

# data
df = pd.DataFrame({'id': [1, 2, 3, 4, 5],
                   'Description': ['Test Only', 'Data test', 'Sample', 'Sample Onces', 'Sample'],
                   'Price': ['1254', 'Fresher', '3569', 'Code test', '245'],
                   'Unit': [12, 4, 1, np.nan, 2]})
# convert price column to numeric and coerce errors
price = pd.to_numeric(df.Price, errors='coerce')
# for rows where price is not numeric, replace description with these values
df.Description = df.Description.mask(price.isna(), df.Price)
# assign numeric price to price column
df.Price = price
df

enter image description here

CodePudding user response:

Use:

#convert valeus to numeric
price = pd.to_numeric(df['Price'], errors='coerce')
#test missing values
m = price.isna()

#shifted only matched rows
df.loc[m, ['Description','Price']] = df.loc[m, ['Description','Price']].shift(-1, axis=1)
print (df)
   id Description Price
0   1   Test Only  1254
1   2     Fresher   NaN
2   3      Sample  3569
3   4   Code test   NaN
4   5      Sample   245

If need numeric values in ouput Price column:

df = df.assign(Price=price)
print (df)
   id Description   Price
0   1   Test Only  1254.0
1   2     Fresher     NaN
2   3      Sample  3569.0
3   4   Code test     NaN
4   5      Sample   245.0
  • Related