2015-04-16 4 views
3

У меня есть dataframe, который выглядит следующим образом:Панды dataframe - на пары строк в ведре

 bucket type v 
0   0 X  14 
1   1 X  10 
2   1 Y  11 
3   1 X  15 
4   2 X  16 
5   2 Y  9 
6   2 Y  10 
7   3 Y  20 
8   3 X  18 
9   3 Y  15 
10  3 X  14 

Нужный результат выглядит следующим образом:

 bucket type v v_paired 
0   1 X  14 nan  (no Y coming before it) 
1   1 X  10 nan  (no Y coming before it) 
2   1 Y  11 14 (highest X in bucket 1 before this row) 
3   1 X  15 11 (lowest Y in bucket 1 before this row) 

4   2 X  16 nan (no Y coming before it in the same bucket) 
5   2 Y  9 16 (highest X in same bucket coming before) 
6   2 Y  10 16 (highest X in same bucket coming before) 

7   3 Y  20 nan (no X coming before it in the same bucket) 
8   3 X  18 20 (single Y coming before it in same bucket) 
9   3 Y  15 18 (single Y coming before it in same bucket) 
10  3 X  14 15 (smallest Y coming before it in same bucket) 

Цель состоит в том, чтобы построить v_paired столбец , и следующие правила:

  • Ищите строки в том же ковше, что и раньше e, которые имеют противоположный тип (X vs Y), назовите этих «парных кандидатов»

  • Если текущая строка X, выберите мин. v из парных кандидатов, чтобы стать v_paired для текущей строки, если текущая строка равна Y, выберите max. v из парных кандидатов для v_paired для текущей строки

Заранее спасибо.

ответ

0

Я считаю, что это должно быть сделано в последовательном порядке ... первой группы по ведру

groups = df.groupby('bucket', group_keys=False) 

этой функция будет применяться к каждой группе ковша

def func(group): 
    y_value = None 
    x_value = None 
    result = [] 
    for _, (_, value_type, value) in group.iterrows(): 
     if value_type == 'X': 
      x_value = max(filter(None,(x_value, value))) 
      result.append(y_value) 
     elif value_type == 'Y': 
      y_value = min(filter(None,(y_value, value))) 
      result.append(x_value) 
    return pd.DataFrame(result) 

df['v_paired'] = groups.apply(func) 

hopefuly это будет делать job

+0

Это нехорошее решение, так как оно связано с итерацией строк. –

+0

true, но нет другого пути ... так как вам нужно сохранить состояние ... также вы делаете группу, которая сделает вещи быстрее и легче читать ... – Eyad

+0

вы могли бы принять мой ответ, если нет лучшего – Eyad

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