迭代pandas数据帧,检查值并创建其中的一些

时间:2016-05-25 12:08:17

标签: python numpy pandas

好的,我有一个(大)数据框,如下所示:

         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行之间应该有两个额外的行,对应于当天的612小时{ {1}},以及第9行和第10行之间的额外行,对应于当天20100203的小时0

我需要什么?我想迭代数据框的20100204列,检查每天是否存在且没有人丢失,以及每天都有四小时(00,06,12,18)。如果在迭代期间缺少某些内容,则应在完全中添加该位置,并将缺少的datedate以及time作为值。为了不再复制所有数据框,让我把最终版本中应该出现的相关方面:

NaN

如果您感兴趣,可以在此处Modular arithmetic in python to iterate a pandas dataframe询问此问题的更简单版本,并由@Alexander和@piRSquared用户友好地回答。这里要求的版本是一个更难的版本,涉及(我想)使用datetime和timedelta并迭代更多列。

很抱歉很长的帖子,非常感谢你。

2 个答案:

答案 0 :(得分:1)

您可以使用pivot进行重新定位 - 按NaN列获取time个缺失值,然后unstack reset_indexsort_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栏中极有可能重复的情况下,我认为没有问题,对吧?解决方案旨在同时消除其他两列中的重复项,对吗? )