I have a Pandas DataFrame with a column of lists. I want create a new column that is comprised of these same lists, minus one specific element:
[In]:
key1 = 'site channel fiscal_week'.split()
key2 = 'site dude fiscal_week'.split()
key3 = 'site eng fiscal_week'.split()
keys = pd.DataFrame({'key': [1,2,3],
'dims': [key1,key2,key3]})
keys
[Out]:
dims key
[site, channel, fiscal_week] 1
[site, dude, fiscal_week] 2
[site, eng, fiscal_week] 3
Here is my approach that failed:
keys['reduced_dims'] = keys['dims'].remove('fiscal_week')
I need to be able to remove a specific element, not pop()
off the last element.
Desired output:
[Out]:
dims key reduced_dims
[site, channel, fiscal_week] 1 [site, channel]
[site, dude, fiscal_week] 2 [site, dude]
[site, eng, fiscal_week] 3 [site, eng]
keys['dims']
is a pd.Series
, not list
, and there's no list.remove()
method. You should use pd.Series.apply()
method, which applies some function to the values in each row.
keys['reduced_dims'] = keys['dims'].apply(
lambda row: [val for val in row if val != 'fiscal_week']
)
keys['reduced_dims']
Out:
0 [site, channel]
1 [site, dude]
2 [site, eng]
Name: reduced_dims, dtype: object
And you can't use just list.remove()
function instead of list comprehension,
lambda row: [val for val in row if val != 'fiscal_week']
because list.remove()
returns None
and you will get such series:
keys['reduced_dims'] = keys['dims'].apply(lambda x: x.remove('fiscal_week'))
keys['reduced_dims']
Out:
0 None
1 None
2 None
Name: reduced_dims, dtype: object
You could try
def rem_fw(lst):
lst.remove('fiscal_week')
return lst
keys['reduced_dims'] = keys['dims'].apply(rem_fw)
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.