【问题标题】:make a dictionary based on a list and pandas data frame根据列表和熊猫数据框制作字典
【发布时间】:2019-01-03 02:46:30
【问题描述】:

我有一个看起来像这样的数据框 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) 删除它例如: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}

非常感谢您的帮助

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    我觉得不用启动dict,用双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}
    

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      这似乎可以解决问题:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-22
        • 2017-01-13
        • 2015-12-13
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        • 1970-01-01
        相关资源
        最近更新 更多