#python
#python
Вопрос:
У меня есть фрейм данных с 4095 записями. Мне нужно создать эталонный фрейм данных с этими записями, реплицирующими каждую строку 30 раз, т.е. месяц, а также добавить новый столбец с датой.
Существующий фрейм данных: S.N Введите местоположение 1 Cash LA 2 D.Card NY
Желаемый результат S.N Введите дату местоположения
- Cash LA 01/01/2020
- Cash LA 01/02/2020 . . .
- 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. Это тоже работает, просто нужно было внести некоторые изменения в формат даты. В любом случае, большое вам спасибо.