Замена значений в определенном столбце DataFrame по словарю
Нужно заменить значения в определенном столбце DataFrame по словарю, при этом, если ключ словаря не найден, нужно удалить всю строку из DataFrame.
Я смог выполнить задачу так:
dict1 = {'Car': 'c', 'Motorcycle': 'mt', 'Truck': 'tr'}
df = pd.DataFrame({'Product': 'Truck Motorcycle Car Car Tire Wheel Truck'.split(),
'Price': [10000, 5000, 23000, 15000, 500, 300, 8000]})
df['Product_new'] = df['Product'].map(dict1)
df.dropna(inplace=True)
df.drop('Product', axis=1, inplace=True)
df_new = df.reindex(columns=['Product_new', 'Price'])
Возможно ли заменить значения сразу в столбце Product, не создавая промежуточный столбец и избавиться от строк, по которым не найден ключ в словаре?
Пытался через replace, но как-то не получилось.
Ответы (3 шт):
Автор решения: strawdog
→ Ссылка
import numpy as np
df["Product"] = df["Product"].map(dict1).fillna(np.nan)
df.dropna(inplace=True)
результат:
Product Price
0 tr 10000
1 mt 5000
2 c 23000
3 c 15000
6 tr 8000
Автор решения: CrazyElf
→ Ссылка
А в чём собственно проблема? Всё работает и если сразу в Product писать:
import pandas as pd
dict1 = {'Car': 'c', 'Motorcycle': 'mt', 'Truck': 'tr'}
df = pd.DataFrame({'Product': 'Truck Motorcycle Car Car Tire Wheel Truck'.split(),
'Price': [10000, 5000, 23000, 15000, 500, 300, 8000]})
df['Product'] = df['Product'].map(dict1)
df.dropna(inplace=True)
Product Price
0 tr 10000
1 mt 5000
2 c 23000
3 c 15000
6 tr 8000
Автор решения: MaxU
→ Ссылка
Вот еще один вариант (однострочник):
df = (df
.query("Product in @dict1.keys()")
.assign(Product=lambda x: x["Product"].replace(dict1)))
результат:
In [84]: df
Out[84]:
Product Price
0 tr 10000
1 mt 5000
2 c 23000
3 c 15000
6 tr 8000