Заполните строки данных Pandas, значение которых равно 0 или NaN, формулой, которая должна быть рассчитана для определенных строк другого столбца. - PullRequest
1 голос
/ 29 апреля 2019

У меня есть дата, где значения в столбце «цена» различаются в зависимости от значений и в столбцах «количество» и «год».Например, для количества, равного 2, у меня есть цена, равная 2 в 2017 году и равная 4 в 2018. Я хотел бы заполнить строки для 2019, которые имеют значение 0 и NaN, значениями от 2018.

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,np.NaN,np.NaN,0,0,np.NaN,0,np.NaN,0,np.NaN])
})

А что, если вместо взятия значений с 2018 года я должен вычислить среднее между 2017 и 2018 годами?

Я попытался перечитать этот вопрос применение его к первому случаю (для применения данных с 2018 года), но оно не работает:

df['price'][df['year']==2019].fillna(df['price'][df['year'] == 2018], inplace = True)

Не могли бы вы мне помочь?

Ожидаемый результат должен бытькадр данных, подобный следующему:

Df со значениями от 2018

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,2,4,6,8,10,12,14,16,18])
})

Df со значениями, которые являются средними между 2017 и 2018

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,1.5,3,4.5,6,7.5,9,10.5,12,13.5])
})

1 Ответ

2 голосов
/ 29 апреля 2019

Вот один способ заполнения со средним значением 2017 и 2018.Начните с группировки данных за предыдущий год по количеству и агрегирования со средним значением:

m = df[df.year.isin([2017, 2018])].groupby('quantity').price.mean()    

Используйте set_index, чтобы установить столбец quantity в качестве индекса, замените 0s наNaNs и используйте fillna, который также принимает словари для сопоставления значений в соответствии с индексом:

ix = df[df.year.eq(2019)].index
df.loc[ix, 'price'] = (df.loc[ix].set_index('quantity').price
                        .replace(0, np.nan).fillna(m).values)

    quantity  year  price
0          1  2017    1.0
1          2  2017    2.0
2          3  2017    3.0
3          4  2017    4.0
4          5  2017    5.0
5          6  2017    6.0
6          7  2017    7.0
7          8  2017    8.0
8          9  2017    9.0
9          1  2018    2.0
10         2  2018    4.0
11         3  2018    6.0
12         4  2018    8.0
13         5  2018   10.0
14         6  2018   12.0
15         7  2018   14.0
16         8  2018   16.0
17         9  2018   18.0
18         1  2019    1.5
19         2  2019    3.0
20         3  2019    4.5
21         4  2019    6.0
22         5  2019    7.5
23         6  2019    9.0
24         7  2019   10.5
25         8  2019   12.0
26         9  2019   13.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...