Время повторной выборки Pandas категориальных данных из столбца с расчетами из другого числового столбца - PullRequest
1 голос
/ 29 мая 2019

У меня есть фрейм данных с категориальным столбцом и числовым индексом, установленным для данных времени

df = pd.DataFrame({
        'date': [
            '2013-03-01 ', '2013-03-02 ',
            '2013-03-01 ', '2013-03-02',
            '2013-03-01 ', '2013-03-02 '
        ],
        'Kind': [
            'A', 'B', 'A', 'B', 'B', 'B'
        ],
        'Values': [1, 1.5, 2, 3, 5, 3]
    })

df['date'] =  pd.to_datetime(df['date'])
df = df.set_index('date')

приведенный выше код дает:

        Kind    Values
date        
2013-03-01  A   1.0
2013-03-02  B   1.5
2013-03-01  A   2.0
2013-03-02  B   3.0
2013-03-01  B   5.0
2013-03-02  A   3.0

Моя цель состоит в том, чтобыдостигните следующего фрейма данных:


         A_count   B_count  A_Val max   B_Val max
date                
2013-03-01   2         1        2             5
2013-03-02   0         3        0             3

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

data = pd.DataFrame(data.resample('D')['Pack'].value_counts())

, мы получим:

    Kind
date    Kind    
2013-03-01  A   2
            B   1
2013-03-02  B   3

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Используйте DataFrame.pivot_table со сглаживанием MultiIndex в столбцах в понимании списка:

df = pd.DataFrame({
        'date': [
            '2013-03-01 ', '2013-03-02 ',
            '2013-03-01 ', '2013-03-02',
            '2013-03-01 ', '2013-03-02 '
        ],
        'Kind': [
            'A', 'B', 'A', 'B', 'B', 'B'
        ],
        'Values': [1, 1.5, 2, 3, 5, 3]
    })

df['date'] =  pd.to_datetime(df['date'])

#is possible omit
#df = df.set_index('date')

df = df.pivot_table(index='date', columns='Kind', values='Values', aggfunc=['count','max'])
df.columns = [f'{b}_{a}' for a, b in df.columns]
print (df)
            A_count  B_count  A_max  B_max
date                                      
2013-03-01      2.0      1.0    2.0    5.0
2013-03-02      NaN      3.0    NaN    3.0

Другое решение с Grouper для повторной выборки по дням:

df = df.set_index('date')

df = df.groupby([pd.Grouper(freq='d'), 'Kind'])['Values'].agg(['count','max']).unstack()
df.columns = [f'{b}_{a}' for a, b in df.columns]
0 голосов
/ 29 мая 2019

Но почему при импорте

data = pd.read_csv('dataset.csv')

и создании точного df, как указано выше (с тысячами строк), а затем при использовании

df = df.set_index('date')

df = df.groupby([pd.Grouper(freq='d'), 'Kind'])['Values'].agg(['count','max']).unstack()
df.columns = [f'{b}_{a}' for a, b in df.columns]

выдается ошибка:

'DataFrame' object has no attribute 'Grouper'

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...