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

2024-06-16 20:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我有一个(大)数据帧,类似这样:

         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  

如您所见,dataframe有一列date,一列time,每天4小时(00、06、12、18)和一列value。在

问题是数据帧中缺少日期,在上面的示例中,第8行和第9行之间应该有两行额外的行,分别对应于当天的小时6和{},第9行和第10行之间还有一行与当天的小时0相对应。在

我需要什么?我想迭代dataframe的date列,检查每天是否存在并且没有人失踪,并且每天都有四个小时(00、06、12、18)。如果在迭代过程中丢失了某些内容,则应该在中精确地添加到中,并将缺少的date和{}和{}作为一个值。为了避免再次复制所有的数据帧,让我介绍一下最终版本中应该出现的相关方面:

^{pr2}$

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

很抱歉给你发了这么长的信,非常感谢。在


Tags: 数据in版本示例内容dataframedatetime
2条回答

您可以使用^{}来重塑形状-在第time列的缺失值中得到{},然后使用^{}和{a4}得到{a2}:

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
^{pr2}$

如果你需要漂亮的index,也许你可以^{}再来一次,比如:

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

好的,谢谢,差不多完成了,有点遗漏,我需要订购数据帧,即每天,从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列中很可能出现重复的情况下,我想没有问题,对吧?该解决方案旨在同时消除其他两列中的重复项,对吗?)在

相关问题 更多 >