Перенос значений из одного столбца в другой на основе другого кадра данных - PullRequest
2 голосов
/ 28 февраля 2020

У меня есть два фрейма данных: DF1

ID  DatePaid   Remaining
A1  2018-01-01   8500
A2  2018-02-15   2000
A2  2018-02-28   1900
A3  2018-04-12   3000
A3  2018-05-12   2700
A3  2018-05-17   110
A3  2018-06-17   0
A4  2018-06-18   10
A5  2018-07-13   500 

Теперь у меня есть еще один фрейм данных DF2, в котором есть только уникальные идентификаторы из первого фрейма данных и даты, которые представляют месяцы:

ID 2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 2018-06-30 2018-07-31
A1
A2
A3
A4
A5

Таким образом, основываясь на первом кадре данных, мне нужно заполнить значения, основанные на значении Remaining, которое находится в первом кадре данных, который находится в соответствующем месяце (поэтому, например, я беру последнее значение для A3 из 2018-05 и поместите его в столбец 2018-05-31 в DF2. ЕСЛИ других значений для этого идентификатора нет, просто заполните все оставшиеся столбцы в DF значением в самом правом заполненном столбце (переверните вправо).

Итак, конечный результат в точности такой:

ID  2018-01-31 2018-02-28 2018-03-31 2018-04-30 2018-05-31 2018-06-30 2018-07-31
A1  8500        8500        8500      8500        8500        8500         8500
A2   NA         1900        1900      1900        1900        1900         1900
A3   NA          NA          NA       3000        110           0             0
A4   NA          NA          NA        NA         NA           10            10
A5   NA          NA          NA        NA         NA           NA           500

Ответы [ 2 ]

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

Это дает вам данные в df2 форме:

month_ends = pd.to_datetime(df1.DatePaid).dt.to_period('M')
# also
# month_ends = pd.to_datetime(df1.DatePaid).add(pd.offsets.MonthEnd(0))

(df1.groupby(['ID', month_ends])
    ['Remaining'].last()
    .unstack(-1)
    .ffill(1)
    .reset_index()
    .rename_axis(columns=None)
)

Вывод:

   ID  2018-01  2018-02  2018-04  2018-05  2018-06  2018-07
0  A1   8500.0   8500.0   8500.0   8500.0   8500.0   8500.0
1  A2      NaN   1900.0   1900.0   1900.0   1900.0   1900.0
2  A3      NaN      NaN   3000.0    110.0      0.0      0.0
3  A4      NaN      NaN      NaN      NaN     10.0     10.0
4  A5      NaN      NaN      NaN      NaN      NaN    500.0
0 голосов
/ 28 февраля 2020

Это мой подход.

df_ = df.pivot_table(index='ID', columns='DatePaid', values='Remaining').fillna(method='ffill',axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...