ValueError: Неверное количество пропущенных элементов 9, размещение подразумевает 1 или NaN, когда в качестве значений одного столбца в Pandas установлены вычисленные результаты - PullRequest
0 голосов
/ 25 февраля 2020

Я хотел бы применить решение от здесь к следующему кадру данных:

  city        date       pct          id    price
0   bj  2019-06-01  0.010002  1210217342      NaN
1   bj  2019-07-01  0.009999  1210217342      NaN
2   bj  2019-08-01  0.009996  1210217342      NaN
3   bj  2019-09-01  0.010000  1210217342      NaN
4   bj  2019-10-01  0.010000  1210217342      NaN
5   bj  2019-11-01  0.000000  1210217342      NaN
6   bj  2019-12-01  0.002683  1210217342      NaN
7   bj  2020-01-01 -0.012374  1210217342      NaN
8   bj  2020-02-01 -0.018702  1210217342  35000.0

Когда я использую код ниже, я получаю правильный результат:

df.fillna({'price':1})\
                            .groupby('id')\
                            .apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
                             .reset_index(level=0, drop=True)

Вывод:

              0             1  ...             7        8
0  34612.079278  34958.180065  ...  35667.054491  35000.0

Но когда я установил для них значение price,

df['price'] = (df.fillna({'price':1})\
                            .groupby('id')\
                            .apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
                             .reset_index(level=0, drop=True))
print(df)

Кажется, это не сработало, потому что некоторые все еще NaN s :

   city        date       pct          id         price
0   bj  2019-06-01  0.010002  1210217342  34612.079278
1   bj  2019-07-01  0.009999  1210217342           NaN
2   bj  2019-08-01  0.009996  1210217342           NaN
3   bj  2019-09-01  0.010000  1210217342           NaN
4   bj  2019-10-01  0.010000  1210217342           NaN
5   bj  2019-11-01  0.000000  1210217342           NaN
6   bj  2019-12-01  0.002683  1210217342           NaN
7   bj  2020-01-01 -0.012374  1210217342           NaN
8   bj  2020-02-01 -0.018702  1210217342           NaN

Или, если я попытаюсь создать новый столбец new_price с ним:

df['new_price'] = (df.fillna({'price':1})\
                            .groupby('id')\
                            .apply(lambda x: (x['price']/(1 + x['pct'].shift(-1).fillna(0)))[::-1].cumprod()[::-1])\
                             .reset_index(level=0, drop=True))

, он выдаст ошибку: ValueError: Wrong number of items passed 9, placement implies 1.

Кстати, при наличии нескольких групп city и id приведенный выше код работает без сбоев.

Кто-нибудь может помочь мне решить эту проблему? Спасибо.

1 Ответ

1 голос
/ 26 февраля 2020

Из вашего сообщения об ошибке кажется, что данные, которые вы хотите использовать для замены столбца df['new_price'], имеют неправильную форму. Т.е. кажется, что у вас есть 1 строка с 9 столбцами вместо одного столбца с 9 строками. Вы можете использовать df.transpose(), чтобы переместить ваши текущие данные на основе строк в столбцы, чтобы позволить вам добавить их в ваш фрейм данных. Ссылка на документы.

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