Pandas如何遍历过滤DataFram的日期列表

2024-04-29 02:28:14 发布

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

如何遍历Pandas的数据帧

我有一个数据帧“数字”,像这样:

         Date   group    Number
0  2013-02-01  group1 -0.098765
1  2013-02-02  group2  0.519878
2  2013-02-03  group1 -0.098765
3  2013-02-04  group3  1.960784
4  2013-02-05  group3  2.859412
5  2013-02-06  group2  1.960784
6  2013-02-07  group1 -0.696594

以及另一个数据框“datelist”中的日期列表,如下所示:

^{pr2}$

我试图返回一个新的数据框,其中包含“numbers”中的每个记录,其中日期是<;=datelist['date']

我试过了:

for date in datelist:
    end = datelist['Date'] 
    numbers2 = numbers[numbers.Date <= end] 

但是for循环返回一个与原始数据帧“numbers”相同的数据帧。在

         Date   group    Number
0  2013-02-01  group1 -0.098765
1  2013-02-02  group2  0.519878
2  2013-02-03  group1 -0.098765
3  2013-02-04  group3  1.960784
4  2013-02-05  group3  2.859412
5  2013-02-06  group2  1.960784
6  2013-02-07  group1 -0.696594

如果我像这样手动输入一系列日期,我可以正确地生成所需的数据帧:

end = pandas.datetime(2013,2,26) 
numbers2 = numbers[numbers.Date <= end] 

我不会通过详细说明这个过程的其余部分来使事情复杂化——基本上,我是在“numbers2”数据帧上逐个“group”执行Groupby,并在继续下一个日期之前将计算附加到另一个数据帧上。在

有人能给我指点正确的方法吗?在


Tags: 数据numberpandasfordategroup数字end
2条回答

我不能百分之百地确定我理解您想要什么,但是我认为您想要为datelist中的每个日期创建一个子数据帧(取自number数据帧)。所以在你的例子中,你想要创建7个数据帧?在

如果是这样,我会这样做:

首先将number(我称之为df)中的date列和{}列转换为datetime64列。我假设numbers中的日期列已经是datetime64类型:

print df
        date   group  number   
0 2013-02-01  group1  -0.098765
1 2013-02-02  group2   0.519878
2 2013-02-03  group1  -0.098765
3 2013-02-04  group3   1.960784
4 2013-02-05  group3   2.859412
5 2013-02-06  group2   1.960784
6 2013-02-07  group1  -0.696594

datelist中,我将创建一个datetime64类型的新列(注意,我更改了datelist中的日期,因此number数据帧中的所有dates都小于{}中的所有日期,并且我让datelist具有更少的观察值以减小输出的大小):

^{pr2}$

现在,我只循环datelist的行,并在date <= end的行中创建一个新的数据帧:

pieces = []
for idx,rows in datelist[['end']].iterrows():
  x = df[df['date'] <= rows['end']]
  x['end'] = rows['end']
  pieces.append(x)

print pd.concat(pieces,ignore_index=True)

          date   group  number           end
0  2013-02-01  group1  -0.098765 2013-02-03
1  2013-02-02  group2   0.519878 2013-02-03
2  2013-02-03  group1  -0.098765 2013-02-03
3  2013-02-01  group1  -0.098765 2013-02-06
4  2013-02-02  group2   0.519878 2013-02-06
5  2013-02-03  group1  -0.098765 2013-02-06
6  2013-02-04  group3   1.960784 2013-02-06
7  2013-02-05  group3   2.859412 2013-02-06
8  2013-02-06  group2   1.960784 2013-02-06
9  2013-02-01  group1  -0.098765 2013-03-06
10 2013-02-02  group2   0.519878 2013-03-06
11 2013-02-03  group1  -0.098765 2013-03-06
12 2013-02-04  group3   1.960784 2013-03-06
13 2013-02-05  group3   2.859412 2013-03-06
14 2013-02-06  group2   1.960784 2013-03-06
15 2013-02-07  group1  -0.696594 2013-03-06
16 2013-02-01  group1  -0.098765 2013-03-08
17 2013-02-02  group2   0.519878 2013-03-08
18 2013-02-03  group1  -0.098765 2013-03-08
19 2013-02-04  group3   1.960784 2013-03-08
20 2013-02-05  group3   2.859412 2013-03-08
21 2013-02-06  group2   1.960784 2013-03-08
22 2013-02-07  group1  -0.696594 2013-03-08

我连接了数据帧,但您可以通过在“end”上执行groupby来处理它们。在

首先,我认为datelist包含元组或类似的内容,而不是日期。 在确保datelist包含datetime对象之后,您可能需要用第二个dataframe中的相应datetime过滤第一个dataframe的每条记录。两个都一样大。在

numbers2 = numbers[numbers.Date <= datelist.Date]

你觉得怎么样,对你有用吗?在

相关问题 更多 >