user11509999
user11509999

Reputation:

Python Dataframe: Remove digits in odd position from df rows?

I have a df with two columns number ,type. I'm trying to remove the number in odd position if type is odd.

For number - (7,14,21,28) without numbers in odd position - 7,21.

Similarly - (3,10,17,24,31) without numbers in odd position - 3,17,31

df

    df= pd.DataFrame(data = {'number' : ['7,14,21,28', '2', '3,6,5,8 ', '4', '3,10,17,24,31'], 'day' : ['odd', 'even', 'even', 'even', 'odd']}) 


    number          type
0   7,14,21,28      odd
1   2               even   
2   3,6,5,8         even
3   4               even
4   3,10,17,24,31   odd

My excepted output:

        number          type
    0   7,21            odd
    1   2               even   
    2   3,6,5,8         even
    3   4               even
    4   3,17,31         odd

Upvotes: 2

Views: 207

Answers (3)

Mayank Porwal
Mayank Porwal

Reputation: 34086

You can use simple string slicing with step = 2:

In [1755]: df.number = np.where(df['day'].eq('odd'), df.number.str.split(',').str[::2].str.join(','), df['number'])

In [1759]: df                                              
Out[1759]: 
     number   day
0      7,21   odd
1         2   even
2   3,6,5,8   even
3         4   even
4   3,17,31   odd

Upvotes: 2

DOOM
DOOM

Reputation: 1244

You can use DataFrame.apply functionality to compute the calculation for each row.


d = pd.DataFrame(
      data = {'number' : ['7,14,21,28', '2', '3,6,5,8 ', '4', '3,10,17,24,31'],       
      'type' : ['odd', 'even', 'even', 'even', 'odd']})

d['number'] = d.apply(
   lambda row: \
      ", ".join(row['number'].split(',')[::2]) 
      if row['type'] == 'odd' 
      else row['number'], axis=1)

print(d.to_string())

      number  type
0      7, 21   odd
1          2  even
2   3,6,5,8   even
3          4  even
4  3, 17, 31   odd

Upvotes: 0

sushanth
sushanth

Reputation: 8302

Try this,

df.loc[df['day'] == "odd", "number"] = df.loc[df['day'] == "odd", "number"]. \
    apply(lambda x : ",".join([str(i) for i in x.split(",") if int(i) % 2 != 0]))

     number   day
0      7,21   odd
1         2  even
2  3,6,5,8   even
3         4  even
4   3,17,31   odd

Upvotes: 1

Related Questions