Как переслать повторную выборку для каждого отдельного значения в столбце - PullRequest
1 голос
/ 11 октября 2019

Во-первых, я хочу переслать данные для каждого уникального значения в Group_Id на 1S, поэтому в основном группируем по Group_Id, а затем повторяем выборку, используя ffill.

Вот данные:

    Id           Timestamp         Data    Group_Id    
0    1     2018-01-01 00:00:05.523 125.5   101 
1    2     2018-01-01 00:00:05.757 125.0   101 
2    3     2018-01-02 00:00:09.507 127.0   52  
3    4     2018-01-02 00:00:13.743 126.5   52  
4    5     2018-01-03 00:00:15.407 125.5   50
                    ...

11   11    2018-01-01 00:00:07.523 125.5   120 
12   12    2018-01-01 00:00:08.757 125.0   120 
13   13    2018-01-04 00:00:14.507 127.0   300  
14   14    2018-01-04 00:00:15.743 126.5   300  
15   15    2018-01-05 00:00:19.407 125.5   350

Я ранее делал это:

def daily_average_temperature(dfdf):
    INDEX = dfdf[['Group_Id','Timestamp','Data']]
    INDEX['Timestamp']=pd.to_datetime(INDEX['Timestamp'])
    INDEX = INDEX.set_index('Timestamp')               
    INDEX1 = INDEX.resample('1S').last().fillna(method='ffill')

    return T_index1

Это неправильно, поскольку он не группировал данные с другим значением Group_Id сначала, но скорее игнорируя столбец.

Во-вторых, я хотел бы распространить значения данных, чтобы каждая строка представляла собой group_id с индексом в виде столбцов, заменяющих Timestamp, и выглядела примерно так:

    x0      x1      x2      x3      x4      x5      ...   Group_Id
0   40      31.05   25.5    25.5    25.5    25      ...   1
1   35      35.75   36.5    36.5    36.5    36.5    ...   2
2   25.5    25.5    25.5    25.5    25.5    25.5    ...   3
3   25.5    25.5    25.5    25.5    25.5    25.5    ...   4
4   25      25      25      25      25      25      ...   5
⋮    ⋮       ⋮        ⋮       ⋮       ⋮        ⋮             ⋮

Обратите внимание, что эта таблицаПриведенное выше не относится к предыдущему набору данных, а просто используется для отображения формата.

Спасибо

1 Ответ

0 голосов
/ 11 октября 2019

Использование DataFrame.groupby с DataFrameGroupBy.resample:

def daily_average_temperature(dfdf):
    dfdf['Timestamp']=pd.to_datetime(dfdf['Timestamp'])
    dfdf = (dfdf.set_index('Timestamp')
                .groupby('Group_Id')['Data']
                .resample('1S')
                .last()
                .ffill()
                .reset_index())

    return dfdf

print (daily_average_temperature(dfdf))
    Group_Id           Timestamp   Data
0         50 2018-01-03 00:00:15  125.5
1         52 2018-01-02 00:00:09  127.0
2         52 2018-01-02 00:00:10  127.0
3         52 2018-01-02 00:00:11  127.0
4         52 2018-01-02 00:00:12  127.0
5         52 2018-01-02 00:00:13  126.5
6        101 2018-01-01 00:00:05  125.0
7        120 2018-01-01 00:00:07  125.5
8        120 2018-01-01 00:00:08  125.0
9        300 2018-01-04 00:00:14  127.0
10       300 2018-01-04 00:00:15  126.5
11       350 2018-01-05 00:00:19  125.5

РЕДАКТИРОВАТЬ: В этом решении используются минимальные и максимальные значения времени для DataFrame.reindex на date_range в DattimeIndex в столбцах после изменения на Series.unstack, также добавляется обратное заполнение при необходимости:

def daily_average_temperature(dfdf):
    dfdf['Timestamp']=pd.to_datetime(dfdf['Timestamp'])
    #remove ms for minimal and maximal seconds in data
    s = dfdf['Timestamp'].dt.floor('S')

    dfdf = (dfdf.set_index('Timestamp')
                .groupby('Group_Id')['Data']
                .resample('1S')
                .last()
                .unstack()
                .reindex(pd.date_range(s.min(),s.max(), freq='S'), axis=1, method='ffill')
                .rename_axis('Timestamp', axis=1)
                .bfill(axis=1)
                .ffill(axis=1)
                .stack()
                .reset_index(name='Data')
                )

    return dfdf

df = daily_average_temperature(dfdf)

print (df['Group_Id'].value_counts())

350    345615
300    345615
120    345615
101    345615
52     345615
50     345615
Name: Group_Id, dtype: int64

Другое решениеаналогично, только date_range задается значениями из строк (не динамически для min и max):

def daily_average_temperature(dfdf):
    dfdf['Timestamp']=pd.to_datetime(dfdf['Timestamp'])
    #remove ms for minimal and maximal seconds in data
    s = dfdf['Timestamp'].dt.floor('S')

    dfdf = (dfdf.set_index('Timestamp')
                .groupby('Group_Id')['Data']
                .resample('1S')
                .last()
                .unstack()
                .reindex(pd.date_range('2018-01-01','2018-01-08', freq='S'), 
                         axis=1, method='ffill')
                .rename_axis('Timestamp', axis=1)
                .bfill(axis=1)
                .ffill(axis=1)
                .stack()
                .reset_index(name='Data')
                )

    return dfdf

df = daily_average_temperature(dfdf)

print (df['Group_Id'].value_counts())
350    604801
300    604801
120    604801
101    604801
52     604801
50     604801
Name: Group_Id, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...