Pandas 如何在python中通过列和行名称获取值

Pandas 如何在python中通过列和行名称获取值,pandas,Pandas,我使用pandas得到一个共现矩阵,如下所示 lst = [ ['a', 'b'], ['b', 'c', 'd', 'e'], ['a', 'd'], ['b', 'e'] ] u = (pd.get_dummies(pd.DataFrame(lst), prefix='', prefix_sep='') .groupby(level=0, axis=1) .sum()) v = u.T.dot(u) v.values[(np.r

我使用pandas得到一个共现矩阵,如下所示

lst = [
    ['a', 'b'],
    ['b', 'c', 'd', 'e'],
    ['a', 'd'],
    ['b', 'e']
]

u = (pd.get_dummies(pd.DataFrame(lst), prefix='', prefix_sep='')
       .groupby(level=0, axis=1)
       .sum())

v = u.T.dot(u)
v.values[(np.r_[:len(v)], ) * 2] = 0

print(v)
我的输出如下

   a  b  c  d  e
a  0  1  0  1  0
b  1  0  1  1  2
c  0  1  0  1  1
d  1  1  1  0  1
e  0  2  1  1  0
我想使用上述矩阵(即
1
)得到ed一起出现的次数,并将其除以共现总数(即
9
-->因为矩阵是对称的,所以我只考虑矩阵的上半部分来获得总和)

所以我的输出应该是

e和d的共现计数为1

所有的共现计数应为9,如下所示(因为矩阵是对称的)

我想知道是否有可能在熊猫身上做这件事


如果需要,我很乐意提供更多详细信息。

我相信您只需要除以上层矩阵的所有值之和,所以除以
2

v = v / (v.values.sum() / 2)
print(v)
          a         b         c         d         e
a  0.000000  0.111111  0.000000  0.111111  0.000000
b  0.111111  0.000000  0.111111  0.111111  0.222222
c  0.000000  0.111111  0.000000  0.111111  0.111111
d  0.111111  0.111111  0.111111  0.000000  0.111111
e  0.000000  0.222222  0.111111  0.111111  0.000000
对于一个值:

print(v.loc['d','e'] / (v.values.sum() / 2))
0.1111111111111111
v.loc['d','e'] = v.loc['d','e'] /v.values.sum() / 2
print(v)

   a  b  c  d         e
a  0  1  0  1  0.000000
b  1  0  1  1  2.000000
c  0  1  0  1  1.000000
d  1  1  1  0  0.111111
e  0  2  1  1  0.000000
如果需要重新分配一个值:

print(v.loc['d','e'] / (v.values.sum() / 2))
0.1111111111111111
v.loc['d','e'] = v.loc['d','e'] /v.values.sum() / 2
print(v)

   a  b  c  d         e
a  0  1  0  1  0.000000
b  1  0  1  1  2.000000
c  0  1  0  1  1.000000
d  1  1  1  0  0.111111
e  0  2  1  1  0.000000

我相信您只需要除以上矩阵的所有值之和,所以除以
2

v = v / (v.values.sum() / 2)
print(v)
          a         b         c         d         e
a  0.000000  0.111111  0.000000  0.111111  0.000000
b  0.111111  0.000000  0.111111  0.111111  0.222222
c  0.000000  0.111111  0.000000  0.111111  0.111111
d  0.111111  0.111111  0.111111  0.000000  0.111111
e  0.000000  0.222222  0.111111  0.111111  0.000000
对于一个值:

print(v.loc['d','e'] / (v.values.sum() / 2))
0.1111111111111111
v.loc['d','e'] = v.loc['d','e'] /v.values.sum() / 2
print(v)

   a  b  c  d         e
a  0  1  0  1  0.000000
b  1  0  1  1  2.000000
c  0  1  0  1  1.000000
d  1  1  1  0  0.111111
e  0  2  1  1  0.000000
如果需要重新分配一个值:

print(v.loc['d','e'] / (v.values.sum() / 2))
0.1111111111111111
v.loc['d','e'] = v.loc['d','e'] /v.values.sum() / 2
print(v)

   a  b  c  d         e
a  0  1  0  1  0.000000
b  1  0  1  1  2.000000
c  0  1  0  1  1.000000
d  1  1  1  0  0.111111
e  0  2  1  1  0.000000

这对你有用吗

a=df.loc['e','b']
b=df.values.sum()/2
print((a/b))

loc
方法中,第一个值是row,第二个值是column。您可以根据需要进行更改。

这对您有用吗

a=df.loc['e','b']
b=df.values.sum()/2
print((a/b))

loc
方法中,第一个值是row,第二个值是column。您可以根据需要进行更改。

非常感谢您的回答。实际上,我想通过指定列名和行名来实现这一点。i、 e.我给出
e
d
,我得到它的共现计数为
1
。接下来,我分别从矩阵(即
9
)中获得总的共时计数,然后将其除以(即1/9=0.111111)。在熊猫身上有这样做的方法吗?:)@EmJ-我想现在明白了,需要标量输入吗?答案已编辑。@jezrael我认为预期的输出值只是一个值。问题是找到特定位置的值(例如,行“d”和列“e”的交点为1,行“e”和列“b”的交点为2),然后将该数字除以整个数据帧总和的一半。整个数据帧的总和是18,因此,其中一半是9。我已经提供了一个解决方案,也许你可以提供一个更好的。好的!知道了。现在才看到更新。但答案似乎是错误的。1/9应该是0.1111,而不是0.027776。我用电脑上的计算器仔细检查了一遍。@mohanys-你说得对,我找不到()。现在工作很好。非常感谢你的回答。实际上,我想通过指定列名和行名来实现这一点。i、 e.我给出
e
d
,我得到它的共现计数为
1
。接下来,我分别从矩阵(即
9
)中获得总的共时计数,然后将其除以(即1/9=0.111111)。在熊猫身上有这样做的方法吗?:)@EmJ-我想现在明白了,需要标量输入吗?答案已编辑。@jezrael我认为预期的输出值只是一个值。问题是找到特定位置的值(例如,行“d”和列“e”的交点为1,行“e”和列“b”的交点为2),然后将该数字除以整个数据帧总和的一半。整个数据帧的总和是18,因此,其中一半是9。我已经提供了一个解决方案,也许你可以提供一个更好的。好的!知道了。现在才看到更新。但答案似乎是错误的。1/9应该是0.1111,而不是0.027776。我用电脑上的计算器仔细检查了一遍。@mohanys-你说得对,我找不到()。现在工作很好。