好的,我有一个(大)数据框,如下所示:
date time value
0 20100201 0 1
1 20100201 6 2
2 20100201 12 3
3 20100201 18 4
4 20100202 0 5
5 20100202 6 6
6 20100202 12 7
7 20100202 18 8
8 20100203 0 9
9 20100203 18 11
10 20100204 6 12
...
8845 20160101 18 8846
如您所见,数据框有一列date
,一列time
,每天有四小时(00,06,12,18)和一列value
。
问题是数据框中缺少日期,在上面的示例中,第8行和第9行之间应该有两个额外的行,对应于当天的6
和12
小时{ {1}},以及第9行和第10行之间的额外行,对应于当天20100203
的小时0
。
我需要什么?我想迭代数据框的20100204
列,检查每天是否存在且没有人丢失,以及每天都有四小时(00,06,12,18)。如果在迭代期间缺少某些内容,则应在完全中添加该位置,并将缺少的date
和date
以及time
作为值。为了不再复制所有数据框,让我把最终版本中应该出现的相关方面:
NaN
如果您感兴趣,可以在此处Modular arithmetic in python to iterate a pandas dataframe询问此问题的更简单版本,并由@Alexander和@piRSquared用户友好地回答。这里要求的版本是一个更难的版本,涉及(我想)使用datetime和timedelta并迭代更多列。
很抱歉很长的帖子,非常感谢你。
答案 0 :(得分:1)
您可以使用pivot
进行重新定位 - 按NaN
列获取time
个缺失值,然后unstack
reset_index
和sort_values
reset_index
:
import pandas as pd
df = pd.DataFrame({'date': {0: 20100201, 1: 20100201, 2: 20100201, 3: 20100201, 4: 20100202, 5: 20100202, 6: 20100202, 7: 20100202, 8: 20100203, 9: 20100203, 10: 20100204},
'time': {0: 0, 1: 6, 2: 12, 3: 18, 4: 0, 5: 6, 6: 12, 7: 18, 8: 0, 9: 18, 10: 6},
'value': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 11, 10: 12}})
print (df)
date time value
0 20100201 0 1
1 20100201 6 2
2 20100201 12 3
3 20100201 18 4
4 20100202 0 5
5 20100202 6 6
6 20100202 12 7
7 20100202 18 8
8 20100203 0 9
9 20100203 18 11
10 20100204 6 12
print (df.pivot(index='date', columns='time', values='value')
.unstack()
.reset_index(name='value')
.sort_values('date'))
time date value
0 0 20100201 1.0
4 6 20100201 2.0
8 12 20100201 3.0
12 18 20100201 4.0
1 0 20100202 5.0
5 6 20100202 6.0
9 12 20100202 7.0
13 18 20100202 8.0
2 0 20100203 9.0
6 6 20100203 NaN
10 12 20100203 NaN
14 18 20100203 11.0
3 0 20100204 NaN
7 6 20100204 12.0
11 12 20100204 NaN
15 18 20100204 NaN
如果你需要不错的index
,也许你可以再次{{3}}:
print (df.pivot(index='date', columns='time', values='value')
.unstack()
.reset_index(name='value')
.sort_values('date')
.reset_index(drop=True))
time date value
0 0 20100201 1.0
1 6 20100201 2.0
2 12 20100201 3.0
3 18 20100201 4.0
4 0 20100202 5.0
5 6 20100202 6.0
6 12 20100202 7.0
7 18 20100202 8.0
8 0 20100203 9.0
9 6 20100203 NaN
10 12 20100203 NaN
11 18 20100203 11.0
12 0 20100204 NaN
13 6 20100204 12.0
14 12 20100204 NaN
15 18 20100204 NaN
答案 1 :(得分:0)
好的,谢谢,几乎差不多完成了,有些东西丢失,我需要订购数据框,即每天,从20100201开始,第一行为00小时,第二行为06 ,第二个为12,第四个为18,然后20100202从00小时开始,依此类推,直到2016年的最后日期...此顺序对于能够对数据进行一些统计非常重要。让我告诉你我得到了什么:
time date value
0 0 20100201 281.0
2224 6 20100201 278.0
4448 12 20100201 285.4
6672 18 20100201 287.6
2225 6 20100202 280.6
4449 12 20100202 287.2
6673 18 20100202 287.8
1 0 20100202 282.4
2 0 20100203 281.6
6674 18 20100203 287.8
4450 12 20100203 285.1
2226 6 20100203 281.0
6675 18 20100204 289.4
4451 12 20100204 286.8
3 0 20100204 284.6
2227 6 20100204 284.2
...
(顺便说一句,在value
栏中极有可能重复的情况下,我认为没有问题,对吧?解决方案旨在同时消除其他两列中的重复项,对吗? )