Pandas 如何在python中通过列和行名称获取值
我使用pandas得到一个共现矩阵,如下所示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
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
)得到e与d一起出现的次数,并将其除以共现总数(即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-你说得对,我找不到()。现在工作很好。