根据列表和熊猫数据框制作字典

时间:2018-07-26 07:22:44

标签: python pandas dictionary dataframe

我有一个看起来像这样的数据框 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}

非常感谢您的帮助

2 个答案:

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