我正在尝试使用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 |

如果我尝试将它们加在一起就会发现它是一团糟。我敢肯定这可能是由于逐位的output如何,但我不知道如何将它变成format,它看起来像一个普通的数据帧。

这是结果:

    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     |

任何帮助将非常感激。

分析解答

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