Как вставить столбец в указанной позиции c в datatable, при добавлении столбца без использования «.insert» / без ручного изменения порядка? - 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}) 

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

создавая этот вывод:

enter image description here

Как поместить столбцы в произвольная позиция при их создании?

Я прочитал как вставить столбец с указанным c индексом столбца в pandas? , и мне удалось поместить их куда угодно с помощью следующего фрагмента:

cols = df.columns.tolist()
print(cols)
cols = ['TIME', 'period (-1)','MONEY', 'period (-2)', 'period (-3)']
df.reindex(columns=cols)

но создание списка cols выглядит как ручная работа. Есть ли способ выбрать for x in range(1,4) l oop, куда поставить колонны? Каким-то образом получая приведенную ниже таблицу из кода, получая данные:

enter image description here

1 Ответ

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

Используйте DataFrame.insert для установки в какую-то позицию, здесь всегда сначала, но необходимо изменить порядок range на reversed:

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

или на range(4, 1, -1):

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

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

Если не изменен порядок:

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

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