2017-12-04 20 views
1

때까지 값을 여러 번 교체 :팬더 : 나는이 같은 팬더 안양이 말

import pandas as pd 
df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8666]}) 

enter image description here

그것은 판매에서 누적 데이터입니다. 데이터에 버그가 있습니다. 일부 관측치가 잘못되었습니다. (값이 이전 값보다 클 수 없습니다. 즉, 8500 및 8666이 올바르지 않습니다.) 이 값을 이전 값으로 대체하려고합니다.

나는이

df['above'] = df.sales.shift(1) 
df.loc[df.above < df.sales, 'sales'] = df.above 

을 시도하지만이 코드는 한 번만 작동, (이전과) 시리즈가 끝날 때까지 모든 값을 대체 할이 코드를 확장하는 방법?

원하는 결과를해야 보이는 같은 :

enter image description here

답변

3
당신은 ffill 사용 후 조건에 의해 NaN s의 값을 대체 할 수

- method='ffill'fillna을 :

df.loc[df.above < df.sales, 'sales'] = np.nan 
df['sales'] = df['sales'].ffill() 
print (df) 
    sales above 
0 114.0  NaN 
1 114.0 114.0 
2 114.0 114.0 
3 113.0 114.0 
4 12.0 113.0 
5 10.0 12.0 
6 10.0 10.0 
7 10.0 8500.0 

를 사용하는 것과 동일 무엇 mask (기본적으로 NaN으로 바뀜)은 항상 정수 값인 경우 int으로 캐스트됩니다. :

df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8666]}) 

df['sales'] = df['sales'].mask(df.sales.shift(1) < df.sales).ffill().astype(int) 
print (df) 
    sales 
0 114 
1 114 
2 114 
3 113 
4  12 
5  10 
6  10 
7  10 

편집 :

df = pd.DataFrame({'sales':[114,114,114,113,12,10,8500,8400]}) 

df['sales'] = df['sales'].mask((df.sales.shift(1) < df.sales).cumsum() > 0).ffill().astype(int) 
print (df) 
    sales 
0 114 
1 114 
2 114 
3 113 
4  12 
5  10 
6  10 
7  10 

세부 사항 :

print ((df.sales.shift(1) < df.sales).cumsum()) 
0 0 
1 0 
2 0 
3 0 
4 0 
5 0 
6 1 
7 1 
Name: sales, dtype: int32 

print ((df.sales.shift(1) < df.sales).cumsum() > 0) 
0 False 
1 False 
2 False 
3 False 
4 False 
5 False 
6  True 
7  True 
Name: sales, dtype: bool 
+0

감사합니다. 그러나 값이 위의 값보다 낮 으면 작동하지 않습니다. 예 : this df = pd.DataFrame ({ 'sales': [114,114,114,113,12,10,8500,8400]}) – SciPy

+0

So 나는'누적 자료'가 불가능하다고 생각한다. 제발 시간 좀주세요. – jezrael

+0

오케이, 고마워요! – SciPy