2015-12-11 5 views
1

У меня есть следующий набор образцов.pandas: groupby two columns nunique

 CustID  Condition  Month  Reading Consumption 
0  108000601   True  June  20110606  28320.0 
1  108007000   True  July  20110705  13760.0 
2  108007000   True  August  20110804  16240.0 
3  108008000   True September  20110901  12560.0 
4  108008000   True October  20111004  12400.0 
5  108000601  False November  20111101  9440.0 
6  108090000  False December  20111205  12160.0 
7  108008000  False January  20120106  11360.0 
8  108000601   True February  20120206  10480.0 
9  108000601   True  March  20120306  9840.0 

Следующая группа предоставляет мне часть того, что я ищу.

dfm.groupby(['Condition'])['CustID'].nunique()

Condition 
True  3 
False  3 

Но как я могу получить уникальные идентификаторы, которые соответствуют обоим условиям? например

Condition 
True  3 
False  3 
Both  2 

ответ

2

Не уверен, если это самый «панды» путь, но вы можете использовать set для сравнения пользователей в каждом разделе (Питон set структуры данных является хэш-таблица, которая будет автоматически отбрасывать дубликаты):

custid_true = set(dfm[dfm['Condition']==True].CustID) 
custid_false = set(dfm[dfm['Condition']==False].CustID) 
custid_both = custid_true.intersection(custid_false) 
n_custid_both = len(custid_both) 
+0

Я новичок в панд, поэтому не уверен, либо, если это pandonics либо, но это, безусловно, работает! – dashvvv

1

Я предлагаю группировать по CustID. Затем мы можем просмотреть каждую группу и легко определить, имеет ли каждый уникальный идентификатор только True, только False, или и то, и другое. Тогда мы просто используем Series.value_counts():

def categorize(s): 
    if s.all(): 
     return 'True' 
    elif not s.any(): 
     return 'False' 
    else: 
     return 'Both' 

categorized = df.groupby('CustID')['Condition'].apply(categorize) 
categorized.value_counts() 

который дает

Both  2 
False 1 
True  1 
Name: Condition, dtype: int64 
+0

Хотя гораздо больше панд, это не возвращает желаемый результат для меня в полном наборе данных. Я получаю все «CustID» или «CustID», которые соответствуют обоим. Я буду продолжать работать с этой стратегией, но для того, чтобы она работала для меня против всего моего набора данных. Благодарю. – dashvvv

+0

Интересно ... если вы найдете подмножество ваших данных, которые воспроизвели проблему, не стесняйтесь редактировать свой вопрос и добавить его, и я посмотрю. – jme