2014-04-01 5 views
2

Панды - как перебирать список дат, фильтр DataFrameПанды - как перебирать список дат, фильтр DataFrame

У меня есть «число» а DataFrame, как это:

  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 

и список дат в другом dataFrame, «DateList», как это:

  Date 
0 2013, 3,5 
1 2013, 3,6 
2 2013, 3,7 
3 2013, 3,8 
4 2013, 3,9 
5 2013, 3,10 
6 2013, 3,11 

Я пытаюсь вернуть новый dataframe, содержащий каждую запись в «чисел», где дата < = DateList [ 'Date']

Я попытался это:

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

но цикл возвращает один DataFrame который является таким же, как и оригинальными DataFrame 'числа'.

  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 

Я могу производить DataFrames мне нужно правильно, если я вхожу в ряд дат вручную, как это:

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

Я не буду усложнять, подробно описав остальную часть этой процедуры - в основном, Я делаю Groupby в DataFrame 'numbers2' по 'группе' и добавляю вычисления к другому DataFrame, прежде чем переходить к следующей дате.

Может ли кто-нибудь указать мне на правильный путь, чтобы сделать это с помощью петли?

ответ

1

Я не уверен на 100%, я понимаю, что вы хотите, но я думаю, что вы хотите использовать субкадр (взятый из number dataframe) для каждой даты в datelist. Итак, в вашем примере вы хотите создать 7 фреймов данных?

Если так это то, что я хотел бы сделать:

Сначала поверните date колонку в number (я буду называть его ДФ) и datelist в 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 поэтому не все из dates в number dataframe были меньше, чем все даты в datelist и я сделал datelist имеют меньше наблюдения, чтобы уменьшить размер выхода):

parse = lambda x: datetime(int(x[0]),int(x[1]),int(x[2])) 
datelist['end'] = datelist['date'].str.split(',').apply(parse) 
print datelist 

     date  end 
0 2013, 2,3 2013-02-03 
1 2013, 2,6 2013-02-06 
2 2013, 3,6 2013-03-06 
3 2013, 3,8 2013-03-08 

Теперь, я буду только петли строки DateList и создать новый dataframe каждый раз Г.Х. из строк, где 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 

Я сцепленных с dataframes, но вы можете обработать их, делая GroupBy на «конец».

+0

Благодарим за это, Карл. Ваше понимание было на месте, и это позволило мне сделать то, что мне нужно. Большое спасибо за вашу помощь, а также за подробное объяснение. – rdh9

0

Во-первых, я думаю, что список дат содержит кортежи или что-то подобное вместо дат. После того, как вы убедитесь, что в списке данных содержатся объекты datetime, вы, вероятно, захотите фильтровать каждую запись первого кадра данных с соответствующим временем datetime во втором. AFAIK оба они имеют одинаковый размер.

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

Как вы думаете, это сработает для вас?

+0

Спасибо, мужиг, я уже пробовал это - это по сути то же самое, что и две строки, которые я написал выше - я добавил переменную «конец» для своей собственной удобочитаемости. Он работает, если я запускаю его вручную, но не в цикле. Кроме того, вы правы в том, что должны быть одного размера, и это тоже проблема, так как первый кадр даты потенциально содержит несколько записей за ту же дату, а даталист будет просто списком дат. т.е. они не могут быть одного размера. Спасибо за вашу помощь. – rdh9

Смежные вопросы