2015-01-04 4 views
1

В панд, если у меня есть данные о транзакциях в dataframe (transdf), который выглядит следующим образом:Панды найти значение в интервале

OrderId, ShippmentSegmentsDays 
1  , 1 
2  , 3 
3  , 4 
4  , 10 

И у меня есть еще один DF (segmentdf), которые определяют интервалы:

ShippmentSegmentDaysStart , ShippmentSegmentDaysEnd , ShippmentSegment 
-9999999     , 0      , 'On-Time' 
0       , 1      , '1 day late' 
1       , 2      , '2 days late' 
2       , 3      , '3 days late' 
3       , 9999999     , '>3 days late' 

И мне нужно добавить еще одну колонку, основанную на «ShippmentSegmentsDays» и «ShippmentSegment». Таким образом, в основном, для каждой строки из «transdf» Мне нужно, чтобы проверить «ShippmentSegmentsDays» значение, в котором интервал может быть найден из «segmentdf»

В результате «transdf» должен выглядеть следующим образом:

OrderId, ShippmentSegmentsDays, ShippmentSegment 
1  , 1     , '1 day late' 
2  , 0     , 'On-Time' 
3  , 4     , '>3 days late' 
4  , 10     , '>3 days late' 

Может ли кто-нибудь дать мне совет, как можно справиться с этой ситуацией?

Спасибо! Стефан

+1

Это похоже на проблему, на которую я ответил некоторое время назад. Дайте ему посмотреть, поможет ли это http://stackoverflow.com/questions/27464394/find-points-in-cells-through-pandas-dataframes-of-cordinates/27466566#27466566 –

ответ

2

Вы можете использовать pandas.apply(args) применить функцию к каждой строке в кадре transdf данных, если вы знаете, что правила, установленные в segmentdf являются статическими и не изменяются. Возможно, вам может помочь следующий фрагмент кода. Я не проверял это, поэтому будьте осторожны, но я думаю, это должно заставить вас начать в правильном направлении.

# create a series of just the data from the 'ShippmentSegmentDays' column 
seg_days_df = trends['ShippmentSegmentDays'] 

# Create a new column, 'ShippmentSegment', in 'transdf' data frame by calling 
# our utility function on the series created above. 
transdf['ShippmentSegment'] = seg_days_df.apply(calc_ship_segment, axis=1) 

# Utility function to define the rules set in the 'segmentdf' data frame 
def calc_ship_segment(num): 
    if not num: 
     return 'On Time' 
    elif num == 1: 
     return '1 Day Late' 
    elif num == 2: 
     return '2 Days Late' 
    elif num == 3: 
     return '3 Days Late' 
    else: 
     return '>3 Days Late' 
+0

'! Num' не является действительный синтаксис Python, я не думаю. – DSM

+0

хорошо catch. Я отредактирую это –

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