#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть набор данных, который выглядит следующим образом:
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25.0
1 20-2020. BE. 101.0 4.0 50.0
2 20-2020. BE. 102.0 2.0 NaN
3 20-2020. BE. 102.0 4.0 NaN
4 20-2020. BE. 103.0 2.0 NaN
5 20-2020. BE. 103.0 4.0 NaN
6 20-2020. BE. 110.0 4.0 10.0
7 20-2020. BE. 111.0 4.0 12.0
Чего мне не хватает, так это номеров продуктов 102 и 103.
Я хочу заполнить их цену, используя цену из продукта 101.
Значение для product_number (102) на заданную неделю (20-2020), страны (BE) и размера продукта (2) Я хочу заполнить selling_price, используя эквивалентные данные из product_number(101). Это означает, что цена продажи теперь должна быть 25. То же правило должно применяться и к продукту номер 103.
Приведенная выше таблица после преобразования должна выглядеть следующим образом:
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25
1 20-2020. BE. 101.0 4.0 50
2 20-2020. BE. 102.0 2.0 25
3 20-2020. BE. 102.0 4.0 50
4 20-2020. BE. 103.0 2.0 25
5 20-2020. BE. 103.0 4.0 50
6 20-2020. BE. 110.0 4.0 10
7 20-2020. BE. 111.0 4.0 12
Мой подход заключался в том, чтобы перебирать таблицу и непрерывно индексировать то, что я искал, и заменять значения, но я получаю некоторые ошибки.
Затем я попробовал, установив фрейм данных, изменив значения, а затем переназначив его.
Я тоже думал об np.where
этом, но не могу понять, как передать указанное условие.
Ответ №1:
Для меня обычно самое простое решение является наиболее эффективным. Я не буду делать здесь никаких ниндзя-панд, просто базовые циклы и словари.
my_dict = dict()
for index in df[(df['product_number'] == 101)].index:
key = (df.loc[index, "product_size"], df.loc[index, "country"], df.loc[index, "week"])
my_dict[key] = df.loc[index, "selling_price"]
for index in df[(df['product_number'] == 102) | (df['product_number'] == 103)].index:
unlock = (df.loc[index, "product_size"], df.loc[index, "country"], df.loc[index, "week_hf"])
df.loc[index, "selling_price"] = my_dict[unlock]
Ответ №2:
Нарежьте фрейм данных, в котором находится номер продукта 101
, и выберите столбец selling_price
после установки индекса этого c
фрейма данных, чтобы создать серию сопоставлений m
, наконец, используйте эту серию сопоставлений вместе с Series.map
для заполнения значений nan в selling_price
столбце:
c = ['week.', 'country.', 'product_size.']
m = df[df['product_number.'].eq(101)].set_index(c)['selling_price']
df['selling_price'] = df['selling_price'].fillna(
pd.Series(df.set_index(c).index.map(m), index=df.index))
week. country. product_number. product_size. selling_price
0 20-2020. BE. 101.0 2.0 25.0
1 20-2020. BE. 101.0 4.0 50.0
2 20-2020. BE. 102.0 2.0 25.0
3 20-2020. BE. 102.0 4.0 50.0
4 20-2020. BE. 103.0 2.0 25.0
5 20-2020. BE. 103.0 4.0 50.0
6 20-2020. BE. 110.0 4.0 10.0
7 20-2020. BE. 111.0 4.0 12.0
Ответ №3:
Вы можете использовать метод fillna для фрейма данных и указать метод как ffill (прямое заполнение): протестируйте эту строку команды в своем ноутбуке jupyter, если вы работаете с :
for v in df[(df['product_number'] == 102) amp; (df['product_number'] == 103)].values:
df.fillna(method='ffill')
Комментарии:
1. но это заполнит все, мне это нужно только для продукта номер 101, 102, 103
2. Итак, вы можете указать поля, которые хотите заполнить :
3. Я постараюсь добавить больше деталей в следующем ответе
4. Если я использую это, в приведенном выше примере все будет заполнено значением 50. что неверно.
5. попробуйте мой новый ответ и дайте мне знать об этом