在为我的熊猫数据框生成统计信息时,我遇到了一些问题。我的数据框如下所示(我省略了索引):
for i in *; do mv "$i/title" "$i/$i%%.mkv" ; done
重要的是,每个URL url = new URL("https://google.com:443/search");
System.out.println(url.getProtocol()); // https
System.out.println(url.getHost()); // google.com
System.out.println(url.getPort()); // 443
都分配了两个id type
1 A
2 B
3 A
1 B
3 B
2 C
4 B
4 C
值,如上例所示。我想计算所有id
个组合的出现次数(因此,用给定的type
组合来计算唯一type
组合的数目),所以我想得到这样一个数据框:
id
我尝试了多种方式使用type
,但徒劳无功。我可以使用type count
A, B 2
A, C 0
B, C 2
和许多代码行来进行这种“计数”,但是我认为必须有一个优雅且适当的解决方案(以python术语)。
预先感谢您的提示。
答案 0 :(得分:5)
pd.value_counts
和itertools.combinations
from itertools import combinations
pd.value_counts(
[(x, y) for _, d in df.groupby('id') for x, y in combinations(d.type, 2)]
)
(A, B) 2
(B, C) 2
dtype: int64
答案 1 :(得分:4)
使用Counter
,groupby
和默认构造函数
from collections import Counter
>>> pd.DataFrame(Counter([tuple(v.type.values) for _,v in df.groupby('id')]), index=['Count']).T
Count
A B 2
B C 2
答案 2 :(得分:3)
将GroupBy
+ apply
与value_counts
一起使用:
from itertools import combinations
def combs(types):
return pd.Series(list(combinations(sorted(types), 2)))
res = df.groupby('id')['type'].apply(combs).value_counts()
print(res)
(A, B) 2
(B, C) 2
Name: type, dtype: int64
答案 3 :(得分:3)
也许使用unique
,请注意仅对一个ID内的两个唯一值有用
df.groupby('id').type.unique().apply(tuple).value_counts()
Out[202]:
(A, B) 2
(B, C) 2
Name: type, dtype: int64