具有非重叠条目集的两列值的共现表
import pandas as pd
可重现的设置
我有一个数据框:
df=
pd.DataFrame.from_dict({'A':['a','b','b','c','d','d','c','b'],
'B':['p','q','p','q','r','r','p','q']})
IE
A B
0 a p
1 b q
2 b p
3 c q
4 d r
5 d r
6 c p
7 b q
如果一个值出现在 column 中B
,它肯定不会出现在 column 中A
,反之亦然。pandas 数据帧的后共现矩阵讨论了类似的设置,但存在重要差异:输入和输出的形式不同(尽管信息内容相似)。与我当前的帖子不同,它也不需要列具有不同的条目集。
目的
我想创建一个新的数据框,它显示每个条目A
与来自A
. 我希望这个新数据框df
的列是来自's column 的条目A
,因此结果如下所示:
res=
pd.DataFrame.from_dict({'B':['p','q','r'],
'a':[1,0,0],
'b':[1,2,0],
'c':[1,1,0],
'd':[0,0,2]})
IE:
B a b c d
0 p 1 1 1 0
1 q 0 2 1 0
2 r 0 0 0 2
B a b c d
0 p 1 1 1 0
1 q 0 2 1 0
2 r 0 0 0 2
题
如何转换df
为上述数据帧?
我试过的
一种)
使用这个答案的问题由两列组并计算大熊猫每个组合的出现,我想出了:
df.groupby(['A','B']).size().to_frame(name = 'size').reset_index()
IE
A B size
0 a p 1
1 b p 1
2 b q 2
3 c p 1
4 c q 1
5 d r 2
这是相似的,但形式不同。可能可以将其转换为我的形式,但可能存在更有效的方法。
乙)
基于此,尝试:
df.pivot_table('A', aggfunc='count').fillna(0)
但这给ValueError: No group keys passed!
. 我不确定链接的帖子是否在发布的地方工作,所以我放弃了这条路。
C)
基于对来自 pandas dataframe 的 Cooccurence matrix问题的回答,我想出了这个:
s=df.stack().str.get_dummies().sum(level=0).ne(0).astype(int)
s=s.T.dot(s).astype(float)
np.fill_diagonal(s.values, np.nan)
s=s[['a','b','c','d']].drop(index=['a','b','c','d'])
s.index.name = 'B'
s=s.astype(int)
s.reset_index(inplace=True)
IE
这就是我想要的。然而,这是一个相当复杂和漫长的解决方案。我更喜欢更紧凑的。
回答
使用交叉表:
import pandas as pd
df = pd.DataFrame.from_dict(
{
"A": ["a", "b", "b", "c", "d", "d", "c", "b"],
"B": ["p", "q", "p", "q", "r", "r", "p", "q"],
}
)
res = pd.crosstab(df['B'], df['A'])
print(res)
输出
A a b c d
B
p 1 1 1 0
q 0 2 1 0
r 0 0 0 2