我正在尝试使用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 |
任何帮助将不胜感激。
答案 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
的结构不匹配