Pandas: повторение строк входного фрейма данных при уменьшении столбца даты на месяц - PullRequest
1 голос
/ 30 апреля 2020

У меня есть данные с 3 столбцами и около 50000 строк. Ниже приведен пример -

ID | ДАТА (datetime64) | COUNT
1 | 30-03-2021 | 45

Я хочу, чтобы каждая строка входных данных повторялась значением, указанным в столбце COUNT, и при этом каждая строка должна иметь столбец DATE, уменьшенный на месяц, как показано ниже:

ID | ДАТА (datetime64)
1 | 30-03-2021
1 | 28-02-2021
1 | 30-01-2021
......................
................. .....
1 | 30-07-2017

Я написал код для генерации вышеуказанного вывода, но это занимает много времени (каждая строка входных данных занимает около 0,09199643135070801 секунды, а все 50000 записей занимают около 35 минут ). Ниже приведен код, который я написал:

import time
import pandas as pd
import dateutil.relativedelta

data1 = pd.read_csv("C:\\Users\\ABD\\Desktop\\data1.csv",parse_dates=['DATE'])
start_time = time.time()
data2 =pd.DataFrame()
k=0
for i in range(len(data1)):
    for j in range(int(data1.loc[i,'COUNT']) ):
        if j==0:
            data2.loc[j+k,'ID'] = data1.loc[i,'ID']
            data2.loc[j+k,'NEW_DATE']=data1.loc[i,'DATE']
        else:
            data2.loc[j+k,'ID'] = data1.loc[i,'ID']
            data2.loc[j+k,'NEW_DATE']=data1.loc[i,'DATE'] - dateutil.relativedelta.relativedelta(months=j)
    k=k+j+1
print("--- %s seconds ---" % (time.time() - start_time))    

Пожалуйста, скажите мне, что есть более эффективный способ сделать это. Заранее спасибо !!

1 Ответ

0 голосов
/ 30 апреля 2020

Это должно быть намного быстрее, чем использование вложенных циклов -

import pandas as pd
from io import StringIO

# Sample dataframe for testing
x = StringIO("""id,date,count
1,30-03-2021,4
2,28-02-2021,3
""")

df = pd.read_csv(x, sep=',')
print(df)


df1 = pd.concat([pd.DataFrame({'id': row[0], 'date': pd.date_range(row[1], freq='-1M', periods=row[2])},
                              columns=['id', 'date']) for row in df.itertuples(name=None, index=False)],
                ignore_index=True)

print(df1)

Вывод:

   id       date
0   1 2021-03-31
1   1 2021-02-28
2   1 2021-01-31
3   1 2020-12-31
4   2 2021-02-28
5   2 2021-01-31
6   2 2020-12-31
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...