2017-09-10 2 views
2

드물게 채워진 열이있는 데이터 프레임이 있습니다. 대부분의 값은 공백입니다. 다른 값은 'Buy'및 'Sell'뿐입니다. 마지막 비 공백 값이 'Buy'또는 'short'이면 공백 값을 'long'으로 바꾸고 싶습니다. 루프에서이 작업을 충분히 쉽게 수행 할 수 있지만이를 수행하는 비 루피 한 방법이 있는지 궁금해하고 있습니까?조건부로 팬더 데이터 프레임의 빈 값 바꾸기

답변

0

당신은 fillna 사용하거나 combine_first에 대한 (방법 ffillfillna - 앞으로 NaN들과 None의 작성) replaceffill와 도우미 df 만든 None의를 대체 할 수

np.random.seed(12) 
df = pd.DataFrame({'A':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'B':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'C':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6))}) 

print (df) 

     A  B  C 
0 Buy Sell None 
1 None None Buy 
2 Sell None Buy 
3 None None Buy 
4 Buy Buy Sell 
5 None None None 
6 None None None 
7 Buy None None 
8 None None Sell 
9 Buy Buy None 

df = df.fillna(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
#alternative solution 
#df = df.combine_first(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
print (df) 
     A  B  C 
0 Buy Sell None 
1 long short Buy 
2 Sell short Buy 
3 short short Buy 
4 Buy Buy Sell 
5 long long short 
6 long long short 
7 Buy long short 
8 long long Sell 
9 Buy Buy short 

설명 :

print (df.replace({'Sell':'short', 'Buy':'long'})) 
     A  B  C 
0 long short None 
1 None None long 
2 short None long 
3 None None long 
4 long long short 
5 None None None 
6 None None None 
7 long None None 
8 None None short 
9 long long None 

print (df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
     A  B  C 
0 long short None 
1 long short long 
2 short short long 
3 short short long 
4 long long short 
5 long long short 
6 long long short 
7 long long short 
8 long long short 
9 long long short 
+0

감사합니다. 답안의 첫 번째 블록은 내가 찾고있는 것을 정확히하는 것처럼 보입니다. 매도 및 판매는 보존되고 공백은 장단점으로 대체됩니다. 귀하의 설명 (블록 2)에서 결과는 모두 원점 및 단락으로 구성됩니다 - 원본 매수와 매도가 없어졌습니다. 코드를 보면, 후자는 내가 예상했던 것입니다. 그러나 코드를 사용하면 전자를 얻습니다. 이것이 내가 원했던 것입니다. 내가 장기간을 가진 매수를 대체하고있는 것처럼 보입니다. 그런데 원래의 매수와 매도가 유지되는 이유는 무엇입니까? – dborger

+0

왜냐하면 나는'replace'와'ffill'에 의해 생성 된 두 번째'df'에 의해'df.fillna'를 사용하기 때문입니다. 그래서 원래의 'Nones'를 두 번째'df'의 값으로 대체합니다. 비슷한 동작'combine_first'. – jezrael

관련 문제