How to delete CELLS and shift to right in Pandas Dataframe

74 views Asked by At

So I have a below table

      P         Q          R      
| -------- | --------| --------
| Performan| Dispite | Cammmr
| Dispo    | camera  | battery
| Perfumo  | Displu  | Cammmmt
| Disper   | camera  | battery
| Dispite  | camera  | battery

so I want the above table to appear like below :

|     P    |     Q    |     R   |    S
| -------- | -------- | --------
| Performan| Dispite  | Cammmr  | blank
| blank    | Dispo    | camera  | battery
| Perfumo  | Displu   | Cammmmt | blank
| blank    | Disper   | camera  | battery
| blank    | Dispite  | camera  | battery

so basically I wan to CUT values in column "P" which starts with "Dis" and then replace them by "blank" and then paste them in the adjacent column shifting thier values to right.

3

There are 3 answers

0
Panda Kim On

Code

  1. adds S column (value is 'blank')
  2. make condition (starting with 'Dis' in P column) -> variable cond,
  3. filters rows and shift and concatenate and so on.

df['S'] = 'blank'
cond = df['P'].str.startswith('Dis')
out = pd.concat([df[~cond], df[cond].shift(axis=1)]).fillna('blank').sort_index()

out:

           P        Q        R        S
0  Performan  Dispite   Cammmr    blank
1      blank    Dispo   camera  battery
2    Perfumo   Displu  Cammmmt    blank
3      blank   Disper   camera  battery
4      blank  Dispite   camera  battery

Example Code

import pandas as pd
data1 = {'P': ['Performan', 'Dispo', 'Perfumo', 'Disper', 'Dispite'], 
         'Q': ['Dispite', 'camera', 'Displu', 'camera', 'camera'], 
         'R': ['Cammmr', 'battery', 'Cammmmt', 'battery', 'battery']}
df = pd.DataFrame(data1)
0
Triky On

You can use pandas shift with a condition(where column P has cells that starts with "Dis")

df['S'] = 'blank'
df[df['P'].str.startswith('Dis')] = df[df['P'].str.startswith('Dis')].shift(axis=1, fill_value='blank')

end result

P Q R S
Performan Dispite Cammmr None
None Dispo camera battery
Perfumo Displu Cammmmt None
None Disper camera battery
None Dispite camera battery
2
Ritesh Sharma On
# For your case you can do the following:
# Add extra Column
df["S"] = "" 

# Filter rows with dis
dis_indices = df['P'].str.startswith("Dis")

# shift the rows
shifted_df = df.loc[dis_indices].shift(1, axis=1) 

# replace the rows
df[dis_indices] = shifted_df[dis_indices] 

# replace nan values
df.fillna("")