#python #pandas
Вопрос:
У меня есть следующий фрейм данных.
df
Current_date ID Current_date 1 Current_Date 2
19/10/2021 11 0.9 0.8
19/10/2021 11 0.7 0.6
19/10/2021 12 1.0 1.5
19/10/2021 13 0.8 0.5
Я хотел бы изменить это и получить следующую таблицу. Чтобы было понятно, чтобы получить значения Date
столбцов, если это Current_date 1
только 1 день в первом столбце (`Current_date ) and if it is
Current_date 2`), добавьте два дня на текущую дату. Затем создайте новый столбец для присвоения значений.
Current_date ID Date Value
19/10/2021 11 20/10/2021 0.9
19/10/2021 11 20/10/2021 0.7
19/10/2021 12 20/10/2021 1.0
19/10/2021 13 20/10/2021 0.8
19/10/2021 11 21/10/2021 0.8
19/10/2021 11 21/10/2021 0.6
19/10/2021 12 21/10/2021 1.5
19/10/2021 13 21/10/2021 0.5
Может ли кто-нибудь помочь с этим в Pandas Python?
Комментарии:
1. Я действительно не понимаю твоего состояния. По каким критериям вы выбираете текущий 1 или текущий 2?
2. В общем, у меня есть выходной прогноз, который может прогнозировать на ближайшие пару дней, например, день 1 (завтра), день 2 и т. Д.
Ответ №1:
Используйте DataFrame.melt
с добавлением временных интервалов по, извлеченных последними вводчиками в столбцах по Series.str.extract
и to_timedelta
:
df = df.melt(['Current_date','ID'], var_name='Date', value_name='Value')
td = pd.to_timedelta(df['Date'].str.extract('(d )
Ответ №2:
Один из вариантов-с помощью pivot_longer от pyjanitor:
# pip install pyjanitor
import pandas as pd
import janitor
df['Current_date'] = pd.to_datetime(df.Current_date)
(df.rename(columns = {"Current_date 1":"Value 1",
"Current_Date 2":"Value 2"})
.pivot_longer(index=['Current_date', 'ID'],
names_to=(".value", "Date"),
names_sep=" ")
.assign(Date = lambda df: df.Current_date
pd.to_timedelta(df.Date.astype(int), unit='D'))
)
Current_date ID Date Value
0 2021-10-19 11 2021-10-20 0.9
1 2021-10-19 11 2021-10-20 0.7
2 2021-10-19 12 2021-10-20 1.0
3 2021-10-19 13 2021-10-20 0.8
4 2021-10-19 11 2021-10-21 0.8
5 2021-10-19 11 2021-10-21 0.6
6 2021-10-19 12 2021-10-21 1.5
7 2021-10-19 13 2021-10-21 0.5
Вы также можете достичь этого с помощью pd.wide_to_long:
df = df.rename(columns = {"Current_date 1":"Value 1",
"Current_Date 2":"Value 2"})
(pd.wide_to_long(df.reset_index(),
stubnames = 'Value',
i = ['Current_date', 'ID', 'index'],
j= 'Date',
sep=' ')
.droplevel('index')
.reset_index()
.assign(Date = lambda df: df.Current_date
pd.to_timedelta(df.Date.astype(int), unit='D'))
)
Current_date ID Date Value
0 2021-10-19 11 2021-10-20 0.9
1 2021-10-19 11 2021-10-21 0.8
2 2021-10-19 11 2021-10-20 0.7
3 2021-10-19 11 2021-10-21 0.6
4 2021-10-19 12 2021-10-20 1.0
5 2021-10-19 12 2021-10-21 1.5
6 2021-10-19 13 2021-10-20 0.8
7 2021-10-19 13 2021-10-21 0.5
, expand=False).astype(int), unit='D')
df['Date']=pd.to_datetime(df['Current_date'],dayfirst=True).add(td).dt.strftime('%d/%m/%Y')
print (df)
Current_date ID Date Value
0 19/10/2021 11 20/10/2021 0.9
1 19/10/2021 11 20/10/2021 0.7
2 19/10/2021 12 20/10/2021 1.0
3 19/10/2021 13 20/10/2021 0.8
4 19/10/2021 11 21/10/2021 0.8
5 19/10/2021 11 21/10/2021 0.6
6 19/10/2021 12 21/10/2021 1.5
7 19/10/2021 13 21/10/2021 0.5
Ответ №2:
Один из вариантов-с помощью pivot_longer от pyjanitor:
Вы также можете достичь этого с помощью pd.wide_to_long: