Условный прием данных для nan-значений pandas

#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. попробуйте мой новый ответ и дайте мне знать об этом