2015-03-03 38 views
-1

嗨,我有一個數據集d1。如何根據兩個條件提取行

import pandas as pd 
d1 = { 
'customers': pd.Series([1, 1, 1, 2, 2, 3, 3, 4, 4]), 
'channel': pd.Series(['a', 'a', 'b', 'c', 'a', 'a', 'b', 'b', 'c']), 
'freq': pd.Series([3, 3, 3, 2, 2, 2, 2, 2, 2]) 
} 
d1=pd.DataFrame(d1) 

我想獲得僅使用兩個不同頻道並且頻道'a'是強制性的客戶列表。

對於離..第一客戶已經使用了兩個不同的信道
第二客戶曾使用使用 'A' & 'B' 的 'A' & 'c' 的第三客戶 '一' & 'B'。但是,客戶4還未使用的信道「A」等等....提前

感謝

回答

0

這是一個小convul​​uted但基本上我們使用GROUPBY,過濾對DF進行乘法過濾器和2級的布爾索引:

In [140]: 
    d1[d1.customers.isin(d1[d1.channel=='a'].customers)].groupby('customers').filter(lambda x: x['channel'].nunique() == 2) 
Out[140]: 
    channel customers freq 
0  a   1  3 
1  a   1  3 
2  b   1  3 
3  c   2  2 
4  a   2  2 
5  a   3  2 
6  b   3  2 

打破下來:

In [141]: 
# filter out just those that have channel a 
d1[d1.channel=='a'] 
Out[141]: 
    channel customers freq 
0  a   1  3 
1  a   1  3 
4  a   2  2 
5  a   3  2 
In [144]: 
# we want these customer ids 
d1[d1.channel=='a'].customers 
Out[144]: 
0 1 
1 1 
4 2 
5 3 
Name: customers, dtype: int64 
In [146]: 
# perform an additional filtering so we only want customers who have channel a 
d1[d1.customers.isin(d1[d1.channel=='a'].customers)] 
Out[146]: 
    channel customers freq 
0  a   1  3 
1  a   1  3 
2  b   1  3 
3  c   2  2 
4  a   2  2 
5  a   3  2 
6  b   3  2 

以上,然後groupby'd客戶,然後我們可以應用過濾器,獨特的(尼姑的數量ique)的顧客等於2

0

爲了讓它更慢一點,例如如果打算過濾邏輯進一步複雜化,這是它試圖不被一個班輪的替代方案(誠然更少優雅)的方法:

def func(x): 
    vals = x['channel'].value_counts() 
    if 'a' in vals and len(vals) == 2: 
     return True 
    return False 

mask = d1.groupby('customers').apply(func) 
print mask 

輸出:

customers 
1    True 
2    True 
3    True 
4   False 
dtype: bool 

現在這取決於你想如何輸出:

# Get a list of customers, like 
# [1, 2, 3] 
target_customers = [k for k, v in mask.to_dict().iteritems() if v] 

# Get a slice of the original DataFrame 
print d1[d1['customers'].isin(target_customers)]