Повторяющиеся строки данных в зависимости от условия - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть фрейм данных pandas, который выглядит примерно так:

hotel_id         date         length_of_stay     clicks
A               2019-01-01           3               7
B               2019-01-06           2               11
C               2019-01-03           1               4

, и я хочу, чтобы результат был:

hotel_id         date                            clicks
A               2019-01-01                          7
A               2019-01-02                          7
A               2019-01-03                          7
B               2019-01-06                          11
B               2019-01-07                          11
C               2019-01-03                          4

Итак, мы видим, сколько кликов мы получили закаждую ночь кто-то останавливался в отеле ...

Я не могу придумать элегантный способ сделать это .. кто-то может помочь?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот другое решение, использующее "уродливый" df.iterrows ():

newdf = pd.concat(pd.DataFrame({
        'hotel_id': row['hotel_id'],
        'date': pd.date_range(start=row['date'], periods=row['length_of_stay']),
        'length_of_stay': row['length_of_stay'],
        'clicks': row['clicks']
    }) for ind, row in df.iterrows())

Полный пример:

import pandas as pd

data = '''\
hotel_id         date         length_of_stay     clicks
A               2019-01-01           3               7
B               2019-01-06           2               11
C               2019-01-03           1               4'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, parse_dates=['date'], sep='\s+')

newdf = pd.concat(pd.DataFrame({
    'hotel_id': row['hotel_id'],
    'date': pd.date_range(start=row['date'], periods=row['length_of_stay']),
    'length_of_stay': row['length_of_stay'],
    'clicks': row['clicks']
}) for ind, row in df.iterrows())

Возвращает:

   clicks       date hotel_id  length_of_stay
0       7 2019-01-01        A               3
1       7 2019-01-02        A               3
2       7 2019-01-03        A               3
0      11 2019-01-06        B               2
1      11 2019-01-07        B               2
0       4 2019-01-03        C               1
0 голосов
/ 20 февраля 2019

Использование numpy.repeat():

m= pd.DataFrame(np.repeat(df.values,df.length_of_stay,axis=0),columns=df.columns)
m['date']=m.groupby('hotel_id')['date'].transform(lambda x: pd.date_range(start=x.iloc[0], periods=len(x)))

или:

newdf = pd.DataFrame(np.repeat(df.values,df.length_of_stay,axis=0),columns=df.columns)
newdf['date'] = [i for day, n in zip(df.date,df.length_of_stay) 
                   for i in pd.date_range(start=day, periods=n)]

Полный пример:

import pandas as pd
import numpy as np

data = '''\
hotel_id         date         length_of_stay     clicks
A               2019-01-01           3               7
B               2019-01-06           2               11
C               2019-01-03           1               4'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, parse_dates=['date'], sep='\s+')

m= pd.DataFrame(np.repeat(df.values,df.length_of_stay,axis=0),columns=df.columns)
m['date']=m.groupby('hotel_id')['date'].transform(lambda x: pd.date_range(start=x.iloc[0], periods=len(x)))
print(m)

  hotel_id       date length_of_stay clicks
0        A 2019-01-01              3      7
1        A 2019-01-02              3      7
2        A 2019-01-03              3      7
3        B 2019-01-06              2     11
4        B 2019-01-07              2     11
5        C 2019-01-03              1      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...