根据列表和数据框架制作词典

2024-04-23 18:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据框 测向

    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}

我想要两件事: 首先,如果键(i,j)=键(j,i),将其移除,例如:键(1,2)和键(2,1) 我想删除(2,1),这样最终的dict将是

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的键(1,2)在同一行中有3次1,因此键(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}

非常感谢你的帮助


Tags: 数据df字典两件事dict计数口述和键
2条回答

我认为不需要启动dict,只要使用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}

希望有帮助

这似乎起到了作用:

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列匹配。)

相关问题 更多 >