2016-09-14 128 views
2

我点名的数据帧以下数据in_file无法子集大熊猫数据帧

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 

于是,我试图子集以下数据帧(这是我们”会打电话 '集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) 

随着 '集2',我回来了空数据帧。但是,我期待看到以下内容:

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

有谁知道为什么“集2”的代码没有返回,我希望将数据帧?

在此先感谢。

+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',ascending = False)' – MaxU

+0

是否有'isin'的对应物,可以让我排除某些数据? – equanimity

回答

2

包括isin()

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

你有你的第二子集数据帧两个相互矛盾的条件

(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有最好的答案

定义cond2

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

这将永远是Falsein_file.Client不能既'ABC''DEF'。您必须使用 '或' |

相反

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

然后

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

enter image description here


但不要选择此答案

它不如使用isin

+0

这很有道理,谢谢。 – equanimity