Панды добавляют фрейм данных к агрегированному фрейму данных - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь использовать панд, чтобы получить максимальное значение даты (вместе с датой) за период, а затем все данные за следующий период.

Вот некоторые примеры данных:

    import pandas as pd
    df = pd.DataFrame([
        ['1','1','20190101',50],
        ['1','1','20190104',60],
        ['1','1','20190121',70],
        ['1','2','20190103',50],
        ['1','2','20190109',90],
        ['1','3','20190106',40],
        ['1','3','20190109',20],
        ['1','3','20190122',70],
        ['2','1','20190102',10],
        ['2','2','20190103',30],
        ['2','2','20190109',50]
    ], columns = ['part1', 'part2', 'date_text', 'cost'])
    print(df)

    |    | part1 | part2 | date_text | cost |    
    |----|-------|-------|-----------|------|    
    |  0 |     1 |     1 |  20190101 |   50 |    
    |  1 |     1 |     1 |  20190104 |   60 |    
    |  2 |     1 |     1 |  20190121 |   70 |    
    |  3 |     1 |     2 |  20190103 |   50 |    
    |  4 |     1 |     2 |  20190109 |   90 |    
    |  5 |     1 |     3 |  20190106 |   40 |    
    |  6 |     1 |     3 |  20190109 |   20 |    
    |  7 |     1 |     3 |  20190122 |   70 |    
    |  8 |     2 |     1 |  20190102 |   10 |    
    |  9 |     2 |     2 |  20190103 |   30 |    
    | 10 |     2 |     2 |  20190109 |   50 |

Так что я собираюсь сделать это, используя это как 1-ю часть:

    df2 = df[df['date_text']<='20190120'].sort_values('date_text').groupby(['part1', 'part2']).last()
    print(df2)

    |       |        | date_text  | cost |
    |-------|--------|------------|------|
    | part1 |  part2 |            |      |
    | 1     |  1     |   20190104 |   60 |
    |       |  2     |   20190109 |   90 |
    |       |  3     |   20190109 |   20 |
    | 2     |  1     |   20190102 |   10 |
    |       |  2     |   20190109 |   50 |

Затем это как 2-ю часть:

    df3 = df[df['date_text']>'20190120']
    print(df3)

    |   | part1 | part2 | date_text | cost |
    |---|-------|-------|-----------|------|
    | 2 |     1 |     1 |  20190121 |   70 |
    | 7 |     1 |     3 |  20190122 |   70 |

Если я попытаюсь добавитьих вместе получается правильный беспорядок.Я уверен, что это, вероятно, связано с тем, как выводится группа по битам, но я не уверен, как преобразовать ее в формат, в котором он выглядит как обычный фрейм данных.

ЭтоРезультат:

    df4 = df2.append(df3)
    print(df4)

    |        | cost | date_text | part1 | part2 |
    |--------|------|-----------|-------|-------|
    | (1, 1) |   60 |  20190104 | NaN   | NaN   |
    | (1, 2) |   90 |  20190109 | NaN   | NaN   |
    | (1, 3) |   20 |  20190109 | NaN   | NaN   |
    | (2, 1) |   10 |  20190102 | NaN   | NaN   |
    | (2, 2) |   50 |  20190109 | NaN   | NaN   |
    | 2      |   70 |  20190121 | 1     | 1     |
    | 7      |   70 |  20190122 | 1     | 3     |

Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 17 июня 2019

Мне кажется, что вы можете добиться этого путем сброса индекса df2 DataFrame:

df4 = df2.reset_index().append(df3)
print(df4)

Выходы:

  part1 part2 date_text  cost
0     1     1  20190104    60
1     1     2  20190109    90
2     1     3  20190109    20
3     2     1  20190102    10
4     2     2  20190109    50
2     1     1  20190121    70
7     1     3  20190122    70

Объяснение:

После группировки по столбцы уже не совпадают (сгруппированный DataFrame теперь имеет MultiIndex, который на самом деле не соответствует структуре df3

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