我有一个看起来像这样的数据框 df
1 2 3 4 5
0 1 1 1 0 0
1 1 1 0 0 0
2 1 0 0 1 1
3 1 1 0 1 0
4 0 1 1 0 0
我还有一本看起来像
的字典dict = {(1, 2): 0,
(1, 3): 0,
(1, 4): 0,
(1, 5): 0,
(2, 1): 0,
(2, 3): 0,
(2, 4): 0,
(2, 5): 0,
(3, 1): 0,
(3, 2): 0,
(3, 4): 0,
(3, 5): 0,
(4, 1): 0,
(4, 2): 0,
(4, 3): 0,
(4, 5): 0,
(5, 1): 0,
(5, 2): 0,
(5, 3): 0,
(5, 4): 0}
我想要两件事: 如果key(i,j)= key(j,i),则首先移除ex,例如:key(1,2)和key(2,1) 我要删除(2,1),所以最终的决定是
dict = {(1, 2): 0,
(1, 3): 0,
(1, 4): 0,
(1, 5): 0,
(2, 3): 0,
(2, 4): 0,
(2, 5): 0,
(3, 4): 0,
(3, 5): 0,
(4, 5): 0}
秒我想更新有关数据帧df的值 如果作为dict中的键的列具有相同的值,则为1计数 例如:第1列和第2列的key(1,2)在同一行中具有1次3次,因此key(1,2)的值将更新为3,依此类推。 所以最终的决定是
dict = {(1, 2): 3,
(1, 3): 1,
(1, 4): 2,
(1, 5): 1,
(2, 3): 2,
(2, 4): 1,
(2, 5): 0,
(3, 4): 0,
(3, 5): 0,
(4, 5): 1}
非常感谢您的帮助
答案 0 :(得分:0)
我认为不需要启动命令,只需使用double for循环即可:
import pandas as pd
from io import StringIO
csv=StringIO("""
1 2 3 4 5
0 1 1 1 0 0
1 1 1 0 0 0
2 1 0 0 1 1
3 1 1 0 1 0
4 0 1 1 0 0""")
sample = pd.read_csv(csv,sep='\s+')
col_com={}
for i in range(sample.shape[1]-1):
for j in range(i+1,sample.shape[1]):
col_com[(i+1,j+1)]=sum(sample.iloc[:,i]&sample.iloc[:,j])
col_com
结果是:
{(1, 2): 3,
(1, 3): 1,
(1, 4): 2,
(1, 5): 1,
(2, 3): 2,
(2, 4): 1,
(2, 5): 0,
(3, 4): 0,
(3, 5): 0,
(4, 5): 1}
希望有帮助
答案 1 :(得分:0)
这似乎可以解决问题:
d_1 = {(1, 2): 0,
(1, 3): 0,
(1, 4): 0,
(1, 5): 0,
(2, 1): 0,
(2, 3): 0,
(2, 4): 0,
(2, 5): 0,
(3, 1): 0,
(3, 2): 0,
(3, 4): 0,
(3, 5): 0,
(4, 1): 0,
(4, 2): 0,
(4, 3): 0,
(4, 5): 0,
(5, 1): 0,
(5, 2): 0,
(5, 3): 0,
(5, 4): 0}
new_keys = []
for k in d_1:
invert = (k[1], k[0])
if invert not in new_keys:
new_keys.append(k)
d_2 = {}
for k in new_keys:
d_2[k] = d_1[k]
df = [
[1, 1, 1, 0, 0],
[1, 1, 0, 0, 0],
[1, 0, 0, 1, 1],
[1, 1, 0, 1, 0],
[0, 1, 1, 0, 0],
]
d_3 = {}
for k in d_2:
v = 0
c1, c2 = k[0] - 1, k[1] - 1
for line in df:
if line[c1] == line[c2]:
v += 1
d_3[k] = v
print(d_3)
输出:
{(1, 2): 3, (1, 3): 1, (1, 4): 3, (1, 5): 2, (2, 3): 3, (2, 4): 1, (2, 5): 0, (3, 4): 1, (3, 5): 2, (4, 5): 4}
(看起来您的示例至少有一个错误:您的结果(1,4)应该为3,而不是2,因为第2、3和4行与第1和4列匹配)