如何基于其他列计算值';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)))]