如何计算 pandas 中共享唯一字段的行
How to count rows that share a unique field in pandas
假设我有一个数据框,用于存储个人阅读过的书籍及其分数:
df = pd.DataFrame({
'person' : [1,1,2,2,3,3],
'book' : ['dracula', 'frankenstein', 'dracula', 'frankenstein', 'dracula', 'rebecca'],
'score':[10,11,12,13,14,15]
})
df
book person score
0 dracula 1 10
1 frankenstein 1 11
2 dracula 2 12
3 frankenstein 2 13
4 dracula 3 14
5 rebecca 3 15
我想要得到的是一个数据框,显示每对书有多少人同时阅读过它们,即期望的结果如下所示:
dracula frankensten rebecca
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
即有两个人dracula
和frankenstein
都看过,一个人dracula
和rebecca
都看过,等等,我不在乎分数
我感觉这与 pivot/stack/unstack 有关,但无法弄清楚,有什么建议吗?
您可以构建一个主元 table 并将其与其转置相乘:
pvt = pd.pivot_table(df, index='book', columns='person', aggfunc=len, fill_value=0)
pvt.dot(pvt.T)
Out:
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
crosstab
的另一个解决方案:
df = pd.crosstab(df.book, df.person)
print (df.dot(df.T))
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
df = df.groupby(['book','person'])['person'].size().unstack().fillna(0).astype(int)
print (df.dot(df.T))
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
假设我有一个数据框,用于存储个人阅读过的书籍及其分数:
df = pd.DataFrame({
'person' : [1,1,2,2,3,3],
'book' : ['dracula', 'frankenstein', 'dracula', 'frankenstein', 'dracula', 'rebecca'],
'score':[10,11,12,13,14,15]
})
df
book person score
0 dracula 1 10
1 frankenstein 1 11
2 dracula 2 12
3 frankenstein 2 13
4 dracula 3 14
5 rebecca 3 15
我想要得到的是一个数据框,显示每对书有多少人同时阅读过它们,即期望的结果如下所示:
dracula frankensten rebecca
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
即有两个人dracula
和frankenstein
都看过,一个人dracula
和rebecca
都看过,等等,我不在乎分数
我感觉这与 pivot/stack/unstack 有关,但无法弄清楚,有什么建议吗?
您可以构建一个主元 table 并将其与其转置相乘:
pvt = pd.pivot_table(df, index='book', columns='person', aggfunc=len, fill_value=0)
pvt.dot(pvt.T)
Out:
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
crosstab
的另一个解决方案:
df = pd.crosstab(df.book, df.person)
print (df.dot(df.T))
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1
df = df.groupby(['book','person'])['person'].size().unstack().fillna(0).astype(int)
print (df.dot(df.T))
book dracula frankenstein rebecca
book
dracula 3 2 1
frankenstein 2 2 0
rebecca 1 0 1