熊猫将数据框附加到聚合数据框

时间:2019-06-17 10:08:32

标签: python pandas append pandas-groupby

我正在尝试使用pandas来获取某个时期内最大日期值(以及日期),然后获取下一个时期内的所有数据。

以下是一些示例数据:

    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 |

因此,我将其用作第一部分:

    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 |

然后将其作为第二部分:

    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 个答案:

答案 0 :(得分:1)

在我看来,您可以通过重置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的结构不匹配