2016-09-14 4 views
2

가 나는 in_file 데이터 프레임에서 다음 데이터를 명명 한 :는 부분 집합 할 수 없습니다 팬더는 dataframe

:
Client Value_01 Value_02 Date 
ABC  100  500  2016-09-01T 
ABC  14  90  2016-09-02T 
DEF  95  1000  2016-09-01T 
DEF  200  600  2016-09-02T 
GHI  75  19  2016-09-01T 
GHI  300  700  2016-09-02T 
JKL  50  02  2016-09-01T 
JKL  400  800  2016-09-02T 

은 내가 (우리가 '하위 1'전화 할게있는) 다음과 데이터 프레임을 부분 집합
df_01 = in_file.loc[(in_file.Date == '2016-09-01T') & (in_file.Client <> 'ABC') & (in_file.Client <> 'DEF')].sort_values('Value_01', ascending=False) 

나는 다시 얻을 :

Client Value_01 Value_02 Date 
GHI  75  19  2016-09-01T 
JKL  50  02  2016-09-01T 

그런 다음, 나는 우리가 '다음으로 데이터 프레임 (부분 집합을 시도 LL 통화 '부분 집합 2') : '부분 집합 2'은 (는)

df_02 = in_file.loc[(in_file.Date == '2016-09-01T') & (in_file.Client == 'ABC') & (in_file.Client == 'DEF')].sort_values('Value_01', ascending=False) 

, 나는 되돌려 빈 데이터 프레임를 얻을. '부분 집합이'코드가 내가 기대하는 데이터 프레임을 반환하지 않는 이유

Client Value_01 Value_02 Date 
ABC  100  500  2016-09-01T 
DEF  95  1000  2016-09-01T 

사람이 알고 있나요 :하지만, 나는 다음과 같은보고 기다리고 있었다?

미리 감사드립니다. isin() 포함

+3

'(in_file.Client == 'ABC') & (in_file.Client == 'DEF')'를 원하십니까? 동시에 둘 다 사실일까요? –

+0

이것을 시도하십시오 :'in_file.loc [(in_file.Date == '2016-09-01T') & (in_file.Client.isin ([ 'ABC', 'DEF'])] sort_values ​​('Value_01', 오름차순 = 거짓)' – MaxU

+0

은 특정 데이터를 제외 할 수있는 isin에 대응되는 것입니까? – equanimity

답변

2

:

In [28]: in_file.loc[(in_file.Date == '2016-09-01T') & in_file.Client.isin(['ABC', 'DEF'])].sort_values('Value_01', ascending=False) 
Out[28]: 
    Client Value_01 Value_02   Date 
0 ABC  100  500 2016-09-01T 
2 DEF  95  1000 2016-09-01T 

제외 :

In [29]: in_file.loc[(in_file.Date == '2016-09-01T') & (~in_file.Client.isin(['ABC', 'DEF']))].sort_values('Value_01', ascending=False) 
Out[29]: 
    Client Value_01 Value_02   Date 
4 GHI  75  19 2016-09-01T 
6 JKL  50   2 2016-09-01T 

또는 약간 느리지 만 훨씬 좋네요 query() 방법 :

In [30]: in_file.query("Date == '2016-09-01T' and Client in ['ABC', 'DEF']") 
Out[30]: 
    Client Value_01 Value_02   Date 
0 ABC  100  500 2016-09-01T 
2 DEF  95  1000 2016-09-01T 

In [31]: in_file.query("Date == '2016-09-01T' and Client not in ['ABC', 'DEF']") 
Out[31]: 
    Client Value_01 Value_02   Date 
4 GHI  75  19 2016-09-01T 
6 JKL  50   2 2016-09-01T 
+0

완벽하게 작동합니다. 감사합니다. – equanimity

+0

@equanimity, 당신은 환영합니다. :) – MaxU

0

당신은 당신의 제 2 서브 세트의 dataframe 두 가지 상반되는 조건을 가지고

(in_file.Client == 'ABC') & (in_file.Client == 'DEF')

은 모두 같은 시간에 사실 수 없다.

'논리'또는 '논리'가 '&'논리가 아닙니다. 그래서

df_02 = in_file.loc[(in_file.Date == '2016-09-02T') or (in_file.Client == 'ABC') or (in_file.Client == 'DEF')].sort_values('Value_01', ascending=False)

당신에게

ABC  100  500  2016-09-01T 
ABC  14  90  2016-09-02T 
DEF  95  1000  2016-09-01T 
DEF  200  600  2016-09-02T 
GHI  300  700  2016-09-02T 
JKL  400  800  2016-09-02T 
+0

감사합니다. 감사합니다. – equanimity

0

주의 할이 아니다 최적의 솔루션을 제공합니다!
나는 단지 당신이 잘못하고있는 것을 지적하고 싶습니다.
@MaxU는

이 항상 Falsein_file.Client로는 'ABC''DEF' 모두가 될 수 없다 할 것이다

cond2 = (in_file.Date == '2016-09-01T') & \ 
     (in_file.Client == 'ABC') & \ 
     (in_file.Client == 'DEF') 

cond2을 정의하는 가장 좋은 대답이있다.그런 다음

df_02 = in_file.loc[cond2].sort_values('Value_01', ascending=False) 
df_02 

enter image description here


는하지만이 대답을 선택하지 마십시오 대신

cond2 = (in_file.Date == '2016-09-01T') & \ 
     ((in_file.Client == 'ABC') | (in_file.Client == 'DEF')) 

|

사용 '또는'해야한다

사용하는만큼 좋지 않다 isin

+0

감사합니다. 고맙습니다. – equanimity