Репликация каждой строки фрейма данных в течение 30 дней (т.Е. Месяца) с использованием цикла for

#python

#python

Вопрос:

У меня есть фрейм данных с 4095 записями. Мне нужно создать эталонный фрейм данных с этими записями, реплицирующими каждую строку 30 раз, т.е. месяц, а также добавить новый столбец с датой.

Существующий фрейм данных: S.N Введите местоположение 1 Cash LA 2 D.Card NY

Желаемый результат S.N Введите дату местоположения

  1. Cash LA 01/01/2020
  2. Cash LA 01/02/2020 . . .
  3. Cash LA 01/30/2020

Пожалуйста, кто-нибудь может подсказать, как я могу это сделать, используя цикл for или любой цикл, на python?

Комментарии:

1. Можете ли вы показать свою работу, чтобы wr мог видеть, что было сделано до сих пор. Также не каждый месяц имеет 30 дней. У некоторых 31, а у февраля 28/29. Вы хотите реплицировать на основе календарных дней. Можете ли вы быть более конкретными в своем запросе. И не могли бы вы поделиться образцами данных и ожидаемыми результатами

Ответ №1:

Это делается с помощью цикла и довольно просто.

Код:

 import pandas as pd
import datetime as dt

df = pd.DataFrame([
    # sample data
    {"S.N. Type":"Cash", "Location":"LA"},
    {"S.N. Type":"Loan", "Location":"TX"},
    {"S.N. Type":"Cash", "Location":"NY"}])
print(df)

df3 = pd.DataFrame()
for row in range(len(df)):
    df2 = pd.DataFrame({'Date:': pd.date_range(dt.date(2020,1,1), dt.date(2020,1,31) pd.DateOffset(-1))})
    df2["S.N. Type"] = df.iloc[row, 0]
    df2["Location"] = df.iloc[row, 1]
    df3 = df3.append(df2)
df3 = df3.reset_index()    
print(df3)
 

Вывод:

   S.N. Type Location
0      Cash       LA
1      Loan       TX
2      Cash       NY
    index      Date: S.N. Type Location
0       0 2020-01-01      Cash       LA
1       1 2020-01-02      Cash       LA
2       2 2020-01-03      Cash       LA
3       3 2020-01-04      Cash       LA
4       4 2020-01-05      Cash       LA
..    ...        ...       ...      ...
85     25 2020-01-26      Cash       NY
86     26 2020-01-27      Cash       NY
87     27 2020-01-28      Cash       NY
88     28 2020-01-29      Cash       NY
89     29 2020-01-30      Cash       NY
 

Комментарии:

1. Я получаю эту ошибку (TypeError: требуется целое число (есть тип str))

2. Вместо этого я использовал:’Date’:(pd.date_range(start = ‘2020-04-01’, end = ‘2020-04-30’, freq = ‘1D’)), и это сработало. В любом случае, большое вам спасибо.

Ответ №2:

Прямое декартово произведение между вашими данными и фреймом данных нужных дней делает это.

 (pd.DataFrame([
    # sample data
    {"S.N. Type":"Cash", "Location":"LA"},
    {"S.N. Type":"Loan", "Location":"LA"},
    {"S.N. Type":"Cash", "Location":"NY"},
])
 # cartesian product to all days between two days
 # couldn't remeber number of days in August so used an offset...
 .assign(foo=1)
 .merge(pd.DataFrame({"Date":pd.date_range(dt.date(2020,6,1), dt.date(2020,9,1) pd.DateOffset(-1))})
        .assign(foo=1),on="foo")
 .drop(columns="foo")
)

 

вывод

     S.N. Type   Location    Date
0   Cash    LA  2020-06-01
1   Cash    LA  2020-06-02
2   Cash    LA  2020-06-03
3   Cash    LA  2020-06-04
4   Cash    LA  2020-06-05
... ... ... ...
271 Cash    NY  2020-08-27
272 Cash    NY  2020-08-28
273 Cash    NY  2020-08-29
274 Cash    NY  2020-08-30
275 Cash    NY  2020-08-31
276 rows × 3 columns
 

Комментарии:

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