我有一个像这样的pandas DataFrame:
import React from 'react';
import { getUserRoles } from 'modules/api/account/user/selectors';
import { connect } from 'react-redux';
import compose from 'utility/compose';
const RestrictedOrFallBack = ({
wrappedComponent,
role,
userRoles,
fallback,
}) => {
debugger;
if (userRoles && userRoles.includes(role)) return wrappedComponent;
return fallback;
};
const mapStateToProps = state => ({
userRoles: getUserRoles(state),
});
const ConnectedRestrictedOrFallback = compose(
connect(mapStateToProps),
RestrictedOrFallBack,
);
export { RestrictedOrFallBack };
export default ({
role,
fallback = () => (<div />),
}) => wrappedComponent => ConnectedRestrictedOrFallback({
role,
fallback,
wrappedComponent,
});
每行包含两个ID,这些ID反映了 from_user to_user
0 123 456
1 894 135
2 179 890
3 456 123
是否“跟随” from_user
。如何使用熊猫计算DataFrame中的共同关注者总数?
在上面的示例中,答案应为1(用户123和456)。
答案 0 :(得分:4)
一种方法是使用MultiIndex设置操作:
In [11]: i1 = df.set_index(["from_user", "to_user"]).index
In [12]: i2 = df.set_index(["to_user", "from_user"]).index
In [13]: (i1 & i2).levels[0]
Out[13]: Int64Index([123, 456], dtype='int64')
要获取计数,必须将该索引的长度除以2:
In [14]: len(i1 & i2) // 2
Out[14]: 1
答案 1 :(得分:2)
另一种方法是将concat
的值和sort
作为字符串。
然后计算值出现多少次:
# concat the values as string type
df['concat'] = df.from_user.astype(str) + df.to_user.astype(str)
# sort the string values of the concatenation
df['concat'] = df.concat.apply(lambda x: ''.join(sorted(x)))
# count the occurences of each and substract 1
count = (df.groupby('concat').size() -1).sum()
Out[64]: 1
答案 2 :(得分:2)
这是执行此操作的另一种方法:
df.loc[df.to_user.isin(df.from_user)]
.assign(hacky=df.from_user * df.to_user)
.drop_duplicates(subset='hacky', keep='first')
.drop('hacky', 1)
from_user to_user
0 123 456
存在整个乘法技巧,以确保我们不返回123 --> 456
和456 --> 123
,因为鉴于我们提供给loc
的条件,这两者都是有效的