如何基于其他列计算值';python中的条件?

如何基于其他列计算值';python中的条件?,python,pandas,Python,Pandas,我有一张如下表: Celebrity Usernames 0 A 2 1 A 1 2 B 3 3 C 2 4 D 2 5 A 3 我想知道有多少用户同时遵循了A,C,D。所以,输出应该是1。如何使用python实现这一点?使用交叉表,然后对列进行子集,并利用bool(0)=False和b

我有一张如下表:

  Celebrity  Usernames
0         A          2
1         A          1
2         B          3
3         C          2
4         D          2
5         A          3

我想知道有多少用户同时遵循了A,C,D。所以,输出应该是1。如何使用python实现这一点?

使用交叉表,然后对列进行子集,并利用
bool(0)=False
bool(任意其他数字)==True这一事实来查看有多少用户名满足您的条件

(pd.crosstab(df['Usernames'], df['Celebrity'])
   .loc[:, ['A', 'C', 'D']]
   .astype(bool)
   .all(axis=1)
   .sum())
#1

交叉表创建一个计数表:

pd.crosstab(df['Usernames'], df['Celebrity'])
#Celebrity  A  B  C  D
#Usernames            
#1          1  0  0  0
#2          1  0  1  1
#3          1  1  0  0
然后我们将其放入一个真值表中

pd.crosstab(df['Usernames'], df['Celebrity']).loc[:, ['A', 'C', 'D']].astype(bool)
#Celebrity     A      C      D
#Usernames                    
#1          True  False  False
#2          True   True   True
#3          True  False  False

下面是一种使用
groupby()
nunique()
的方法:

还有一种方法:

df.groupby(['Usernames','Celebrity']).size().loc[(slice(None),l)].unstack().gt(0)
以及交叉表的替代方案:

df['Celebrity'].str.get_dummies().groupby(df['Usernames']).sum().loc[:,l].astype(bool).all(axis=1)
使用地图:

df.loc[df['Usernames'].map(df.groupby('Usernames')['Celebrity'].agg(set).ge(set(l)))]

你听说过字典吗?上一个字典返回的值与前三个解决方案不同。你能找出原因吗?只是好奇。第一个已经很好地实现了我的目标。你是说最后一个解决方案没有返回包含所有名人的用户名2,还是格式看起来与其他解决方案不同?最后一个解决方案不知何故没有返回正确的答案。它总是返回一个小于前三个解决方案返回的值。例如,我有一个邻接矩阵,它显示A和B有27个共同的用户。前三个解决方案返回27。最后一个给我17。我无法调试。如果我去查看用户名列表,两个答案都有一些相同的用户,而有些用户没有。我做了一个轻微的编辑。。。将
.eq()
更改为
.ge()
df.loc[df['Usernames'].map(df.groupby('Usernames')['Celebrity'].agg(set).ge(set(l)))]