2015-12-28 2 views
2

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

id time a b 
01 01 1 0 
01 02 0 1 
01 03 0 0 
02 01 0 0 
02 02 1 0 
02 03 1 1 
02 04 0 0 

Так вот, вывод должен быть

id time a b 
01 01 1 0 
01 02 1 1 
01 03 1 1 
02 01 0 0 
02 02 1 0 
02 03 1 1 
02 04 1 1 

Здесь я группирование по id и для каждого id, df сортируется по time. Теперь я хочу заменить значения в a и b на максимальное значение, которое вы видели до сих пор. Думаю, я могу применить максимальную скорость для каждой группы, но есть ли лучший способ сделать это?

+0

ли кто-нибудь из ответов помочь? – Stefan

ответ

0

Вид как совокупный максимум? :) http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.cummax.html

Вам нужно будет называть это для каждой группы, но это бьет для цикла, который вам также нужно будет делать для каждой группы.

+0

Я сделал 'df ['a'] = df.groupby ('id') ['a']. Apply (pd.cummax)', но это дает ошибку 'AttributeError: 'module' объект не имеет атрибута 'cummax' '. Не уверен, как использовать cummax! Благодаря :) – Peeyush

0

Вы можете apply пользовательские функции, где найти индекс первого 1 по idxmax и установить строки в конце группы к 1:

print df 
    id time a b 
0 1  1 1 0 
1 1  2 0 1 
2 1  3 0 0 
3 2  1 0 0 
4 2  2 1 0 
5 2  3 1 1 
6 2  4 0 0 

def f(df): 
    x1 = df.idxmax() 
    df.loc[x1:] = 1 
    return df 

df['a'] = df.groupby('id')['a'].apply(f) 
df['b'] = df.groupby('id')['b'].apply(f) 
print df 
    id time a b 
0 1  1 1 0 
1 1  2 1 1 
2 1  3 1 1 
3 2  1 0 0 
4 2  2 1 0 
5 2  3 1 1 
6 2  4 1 1 
Смежные вопросы