2017-01-29 5 views
1

У меня есть dataframeПанды выбрать последнее значение строки терке чем

a = {'Price': [10, 15, 5, 25, 30], 'Total': [10000, 12000, 15000, 14000, 0], 
    'WAP': [10, 10.83, 9.66, 1, 1]} 
a = pd.DataFrame(a) 
print (a) 

Я ИЩУ создать новый столбец, который говорит, что если [ «WAP»] == 1, а затем посмотреть на [ «WAP» ] и вернуть прежнее значение в столбце, который не является 1.

Таким образом, в данном случае я хочу, чтобы создать новый столбец со значениями,

new = [10, 10.83, 9.66, 9.66, 9.66] 

Я попытался итерацию через колонку, но только в состоянии измените первый 1 на 9.66

aw = [] 

for i in range(len(a)): 
    if a.loc[i, 'WAP'] == 1: 
     aw.append(a.loc[i-1, 'WAP']) 
    else: 
     aw.append(a.loc[i, 'WAP']) 

print (aw) 
+0

Whould вы хотите добавить записи из нового к существующему списку в записи в каталоге или вы хотите добавить список в запись? – Alex

ответ

2

Одно из возможных решений:

for i, row in a.iterrows(): 
    if row['WAP'] == 1: 
     a.loc[i, 'WAP'] = a.loc[i-1, 'WAP'] 
    else: 
     a.loc[i, 'WAP'] = a.loc[i,'WAP'] 
print (a) 

    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 

Итеративный характер расчета, где входы зависят от результатов предыдущих этапов усложняет векторизации. Вы могли бы использовать apply с функцией, которая выполняет тот же расчет, что и цикл, но за кулисами это также будет цикл.

Еще лучшим решением будет заменить 1 на NaN с mask, а затем ffill предыдущим значением:

a.WAP = a.WAP.mask(a.WAP == 1).ffill() 
print (a) 
    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 

Решение с replace:

a.WAP = a.WAP.replace({1:np.nan}).ffill() 
print (a) 
    Price Total WAP 
0  10 10000 10.00 
1  15 12000 10.83 
2  5 15000 9.66 
3  25 14000 9.66 
4  30  0 9.66 
+0

Это прекрасно работает - спасибо – ben121

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