2015-10-22 1 views
1

У меня есть кадр данных pandas F с отсортированным индексом I. Мне интересно узнать о последнем изменении в одном из столбцов, скажем, A. В частности, я хочу построить ряд с тем же индексом, что и F, а именно I, значение которого в i равно j, где j - наибольшее значение индекса менее i, такое что F[A][j] != F[A][i]. Например, рассмотрим следующий кадр:Pandas: индекс последнего не равного ряда

A 
1 5 
2 5 
3 6 
4 2 
5 2 

Нужный серия будет:

1 NaN 
2 NaN 
3 2 
4 3 
5 3 

Есть ли панды/NumPy идиоматических способ построить эту серию?

+2

Это действительно сбивает с толку. Что, например, это «текущая строка»? – ako

+0

Отредактировано для наглядности. –

+0

huh ??? Описание все еще очень запутанно. – Alexander

ответ

0

Попробуйте это:

df['B'] = np.nan 
last = np.nan 
for index, row in df.iterrows(): 
    if index == 0: 
     continue 
    if df['A'].iloc[index] != df['A'].iloc[index - 1]: 
     last = index 
    df['B'].iloc[index] = last 

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

+0

Я надеялся, что есть способ сделать это, чтобы избежать цикла в python. Обычно функции панды или numpy намного быстрее –

+0

Я не думаю, что это значительно эффективнее. Кроме того, если вы хотите пропустить его, удерживая указатели, вам может потребоваться использовать старый добрый «for». Хотя я могу ошибаться. –

0

np.argmax или pd.Series.argmax по булевым данным может помочь вам найти первое (или в данном случае, последнее) значение True. Тем не менее, вам все равно придется перебирать серию в этом решении.

# Initiate source data 
F = pd.DataFrame({'A':[5,5,6,2,2]}, index=list('fobni')) 

# Initiate resulting Series to NaN 
result = pd.Series(np.nan, index=F.index) 

for i in range(1, len(F)): 
    value_at_i = F['A'].iloc[i] 
    values_before_i = F['A'].iloc[:i] 
    # Get differences as a Boolean Series 
    # (keeping the original index) 
    diffs = (values_before_i != value_at_i) 
    if diffs.sum() == 0: 
     continue 
    # Reverse the Series of differences, 
    # then find the index of the first True value 
    j = diffs[::-1].argmax() 
    result.iloc[i] = j 
Смежные вопросы