2013-07-21 2 views
6

DataFrame에 주식 값이 포함되어 있습니다.팬더 데이터 프레임의 다른 두 열의 값을 조건부로 선택하여 새 열

그것은 다음과 같습니다

>>>Data Open High Low Close Volume Adj Close Date              
2013-07-08 76.91 77.81 76.85 77.04 5106200 77.04 

내가 가진 조건 새 열을 만들려고

다음 if 문 :

Traceback (most recent call last): 
    File "<pyshell#116>", line 1, in <module> 
    Data[1]['Test'] =Data[1]['Close'] if Data[1]['Close'] > Data[1]['Open'] else Data[1]['Open'] 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
: 나는 다음과 같은 오류가

Data['Test'] =Data['Close'] if Data['Close'] > Data['Open'] else Data['Open'] 

그 다음 사용 a.all() :

Data[1]['Test'] =Data[1]['Close'] if all(Data[1]['Close'] > Data[1]['Open']) else Data[1]['Open'] 

그 결과 전체 ['Open'] 열이 선택되었습니다. ['Open']['Close'] 열 사이에서 가장 큰 값을 선택할 때마다 원하는 조건을 얻지 못했습니다.

도움을 주시면 감사하겠습니다.

감사합니다.

답변

4

는 :

>>> df["Test"] = df[["Open", "Close"]].max(axis=1) 
>>> df 
     Date Open High Low Close Volume Adj Close Test 
0 2013-07-08 76.91 77.81 76.85 77.04 5106200  77.04 77.04 
1 2013-07-00 77.04 79.81 71.81 72.87 1920834  77.04 77.04 
2 2013-07-10 72.87 99.81 64.23 93.23 2934843  77.04 93.23 

df.ix[:,["Open", "Close"]].max(axis=1) 조금 더 빨리 될 수도 있지만 나는 그것을보고 같은 좋은 생각하지 않습니다 :

>>> df 
     Date Open High Low Close Volume Adj Close 
0 2013-07-08 76.91 77.81 76.85 77.04 5106200  77.04 
1 2013-07-00 77.04 79.81 71.81 72.87 1920834  77.04 
2 2013-07-10 72.87 99.81 64.23 93.23 2934843  77.04 

내가 생각할 수있는 간단한 일이 될 것이다 에서.

>>> df["Test"] = df.apply(lambda row: max(row["Open"], row["Close"]), axis=1) 
>>> df 
     Date Open High Low Close Volume Adj Close Test 
0 2013-07-08 76.91 77.81 76.85 77.04 5106200  77.04 77.04 
1 2013-07-00 77.04 79.81 71.81 72.87 1920834  77.04 77.04 
2 2013-07-10 72.87 99.81 64.23 93.23 2934843  77.04 93.23 

또는 NumPy와 다시 가을 :

또는, 행에 .apply를 사용할 수

>>> df["Test"] = np.maximum(df["Open"], df["Close"]) 
>>> df 
     Date Open High Low Close Volume Adj Close Test 
0 2013-07-08 76.91 77.81 76.85 77.04 5106200  77.04 77.04 
1 2013-07-00 77.04 79.81 71.81 72.87 1920834  77.04 77.04 
2 2013-07-10 72.87 99.81 64.23 93.23 2934843  77.04 93.23 

기본적인 문제는 if/elseif (something) 때문에, 배열을 잘 재생되지 않는다는 것입니다 항상 something을 단일 bool으로 강제 변환합니다."배열의 모든 요소에 대해, 조건이 만족되면"또는 이와 비슷한 것은 해당하지 않습니다. 내가``안양은 [ 'B']``당신은 스칼라을 넣을 수 있습니다

0

문제는 파이썬이 둘 이상의 부울 값을 포함하는 조건 (Data['Close'] > Data['Open'])을 평가하도록 요청하는 것입니다. 어느 하나 이후로 any 또는 all을 사용하지 않으려면 Data['Test']Data['Open'] 또는 Data['Close'] 중 하나로 설정해야합니다.

는 청소기 방법이있을 수 있습니다,하지만 한 가지 방법은 마스크 (부울 배열)를 사용하는 것입니다 :

mask = Data['Close'] > Data['Open'] 
Data['Test'] = pandas.concat([Data['Close'][mask].dropna(), Data['Open'][~mask].dropna()]).reindex_like(Data) 
3
In [7]: df = DataFrame(randn(10,2),columns=list('AB')) 

In [8]: df 
Out[8]: 
      A   B 
0 -0.954317 -0.485977 
1 0.364845 -0.193453 
2 0.020029 -1.839100 
3 0.778569 0.706864 
4 0.033878 0.437513 
5 0.362016 0.171303 
6 2.880953 0.856434 
7 -0.109541 0.624493 
8 1.015952 0.395829 
9 -0.337494 1.843267 

이것은이 어디 조건, A의 나에게 가치를 부여 말하는 경우> B가, 다른 날이 경우

# this syntax is EQUIVALENT to 
# df.loc[df['A']>df['B'],'A'] = df['B'] 

In [9]: df['A'].where(df['A']>df['B'],df['B']) 
Out[9]: 
0 -0.485977 
1 0.364845 
2 0.020029 
3 0.778569 
4 0.437513 
5 0.362016 
6 2.880953 
7 0.624493 
8 1.015952 
9 1.843267 
dtype: float64 

를 B주는 max 동일합니다

In [10]: df.max(1) 
Out[10]: 
0 -0.485977 
1 0.364845 
2 0.020029 
3 0.778569 
4 0.437513 
5 0.362016 
6 2.880953 
7 0.624493 
8 1.015952 
9 1.843267 
dtype: float64 
같은 DataFrame에서 5,
+0

(예를 들어 '닫기'), 당신이 (다른 coulumn 당신이 안양 [''에서 셀렉틴된다 예를 들어 열을 이렇게 정말해야하지만 ' A는 B ']'', 그렇지 않으면 당신은 혼합 플로트/문자열 열을 얻을 것이다, 일반적으로 유용하지'[DF]> 'A']''안양 [''마스크와 동일 할 필요는 없다 '(그리고 .. ''DF :) 아무것도 효율적 또한 I는'DF [ 'B']'FYI이 정확히 동일하다 (그리고 팬더 선택기 열로 정렬한다)를 대체 값이 다른 열을 가질 수있다 .loc [df [ 'A']> df [ 'B'], 'A'] = df [ 'B']'' – Jeff

관련 문제