Построить строки в Python Dataframe, основываясь на значениях в предыдущем столбце - PullRequest
1 голос
/ 05 февраля 2020

Мой ввод выглядит следующим образом:

import datetime as dt
import pandas as pd

some_money = [34,42,300,450,550]
df = pd.DataFrame({'TIME': ['2020-01', '2019-12', '2019-11', '2019-10', '2019-09'], \
                    'MONEY':some_money}) 
df

Производит следующее:

enter image description here

Я хочу добавить еще 3 столбца получая значение MONEY за предыдущий месяц, вот так (цветовое кодирование в иллюстративных целях):

enter image description here

Вот что я пробовал:

prev_period_money = ["m-1", "m-2", "m-3"]
for m in prev_period_money:
    df[m] = df["MONEY"] - 10 #well, it "works", but it gives df["MONEY"]- 10...

Столбец TIME отсортирован, поэтому об этом не следует беспокоиться. (Но было бы замечательно, если бы кто-то показал «волхвов» c, имея возможность получить данные из него.)

Ответы [ 4 ]

2 голосов
/ 05 февраля 2020

Используйте для pandas 0,24+ fill_value=0 в Series.shift, тогда также есть правильные столбцы целых чисел:

for x in range(1,4):
    df[f"m-{x}"] = df["MONEY"].shift(periods=-x, fill_value=0)

print (df)
      TIME  MONEY  m-1  m-2  m-3
0  2020-01     34   42  300  450
1  2019-12     42  300  450  550
2  2019-11    300  450  550    0
3  2019-10    450  550    0    0
4  2019-09    550    0    0    0

Для pandas ниже 0,24 необходимо заменить затуманивание значения и преобразовать в целые числа:

for x in range(1,4):
    df[f"m-{x}"] = df["MONEY"].shift(periods=-x).fillna(0).astype(int)
1 голос
/ 05 февраля 2020
import pandas as pd

columns = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov"]
some_money = [34,42,300,450,550]

df = pd.DataFrame({'TIME': ['2020-01', '2019-12', '2019-11', '2019-10', '2019-09'], 'MONEY':some_money})

prev_period_money = ["m-1", "m-2", "m-3"]
count = 1
for m in prev_period_money:
    df[m] = df['MONEY'].iloc[count:].reset_index(drop=True)
    count += 1

df = df.fillna(0)

Выход:

      TIME  MONEY    m-1    m-2    m-3
0  2020-01     34   42.0  300.0  450.0
1  2019-12     42  300.0  450.0  550.0
2  2019-11    300  450.0  550.0    0.0
3  2019-10    450  550.0    0.0    0.0
4  2019-09    550    0.0    0.0    0.0
1 голос
/ 05 февраля 2020

Это довольно легко, если вы используете shift

Это даст вам желаемый результат:

df["m-1"] = df["MONEY"].shift(periods=-1)
df["m-2"] = df["MONEY"].shift(periods=-2)
df["m-3"] = df["MONEY"].shift(periods=-3)
df = df.fillna(0)

Это будет работать, только если он будет заказан. В противном случае вы должны заказать его раньше.

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

Мое предложение: используйте понимание списка с функцией сдвига, чтобы получить три столбца, объединить их в столбцы и снова объединить их с исходным фреймом данных

(pd.concat([df,pd.concat([df.MONEY.shift(-i) for i in 
                         range(1,4)],axis=1)],
           axis=1)
  .fillna(0)
 )


    TIME    MONEY   MONEY   MONEY   MONEY
0   2020-01 34  42.0    300.0   450.0
1   2019-12 42  300.0   450.0   550.0
2   2019-11 300 450.0   550.0   0.0
3   2019-10 450 550.0   0.0 0.0
4   2019-09 550 0.0 0.0 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...