Reputation:
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
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
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
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