Как заполнить пустое значение ячейки в пандах с условием - PullRequest
0 голосов
/ 05 ноября 2019

Мой образец данных, как показано ниже. Доступны фактические данные до 2020 года.

    Item  Year    Amount  final_sales
    A1    2016    123     400
    A2    2016    23      40
    A3    2016    6       
    A4    2016    10      100
    A5    2016    5       200
    A1    2017    123     400
    A2    2017    23      
    A3    2017    6       
    A4    2017    10      
    A5    2017    5       200

Мне необходимо экстраполировать данные столбца за 2017 год (и последующие годы) final_sales для каждого элемента, если данные за 2017 год недоступны.
В указанном выше наборе данных final_sales не доступно для 2017 года для A2 и A4, но доступно для 2016 года. Как ввести значение данных 2016 (final_sales), если соответствующий год final_sales недоступен?

Ожидаемые результаты, как показано ниже. Спасибо.

    Item  Year    Amount  final_sales
    A1    2016    123     400
    A2    2016    23      40
    A3    2016    6       
    A4    2016    10      100
    A5    2016    5       200
    A1    2017    123     400
    A2    2017    23      40
    A3    2017    6       
    A4    2017    10      100
    A5    2017    5       200

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

Для меня работает GroupBy.ffill, только необходимые отсортированы Year столбец, как в вопросе данные образца:

#if necessary sorting by both columns
df = df.sort_values(['Year', 'Item'])
df['final_sales'] = df.groupby('Item')['final_sales'].ffill()
print (df)
  Item  Year  Amount  final_sales
0   A1  2016     123        400.0
1   A2  2016      23         40.0
2   A3  2016       6          NaN
3   A4  2016      10        100.0
4   A5  2016       5        200.0
5   A1  2017     123        400.0
6   A2  2017      23         40.0
7   A3  2017       6          NaN
8   A4  2017      10        100.0
9   A5  2017       5        200.0
0 голосов
/ 05 ноября 2019

Как-то так?:

    def fill_final(x):
        if x['year'] != 2016:
            return df[(df['year'] == 2016) & (df['Item'] == x['Item'])]['final_sales']
        else: return x['final_sales']
    df['final_sales'] = df.apply(lambda x: fill_final(x), axis = 1)

не проверял это, но установил правильный путь

0 голосов
/ 05 ноября 2019

Похоже, что вы хотите заполнить вперед, где отсутствуют данные.

Вы можете сделать это с помощью 'fillna', который доступен для объектов pd.DataFrame.

В вашем случае, вы хотите заполнить только вперед для каждого элемента, поэтому сначала группируйте по элементам, а затем используйте fillna. Метод 'pad' просто переносит вперед по порядку (следовательно, поэтому мы сортируем в первую очередь).

df['final_sales'] = df.sort_values('Year').groupby('Item')['final_sales'].fillna(method='pad')

Обратите внимание, что в данных вашего примера A3 также отсутствует для 2016 года, поэтому нет ничего для переноса ина 2017 год его не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...