【问题标题】:How can I compare some lists in python and add them into a dataframe?如何比较 python 中的一些列表并将它们添加到数据框中?
【发布时间】:2021-12-12 18:42:42
【问题描述】:

我有四个列表包含不同的数字,如下所示:

list1 = [399826, 399827, 413350, 404450, 399827, 404451]  
list2 = [399825, 399826, 412450, 403650, 391227]  
list3 = [412450, 399827]  
list4 = [399829, 399246, 513350, 404370, 789827, 439931, 404451]  

关于列表,列表之间存在重叠。我将制作一个数据框,其中显示一组所有数字和它们所属的列表的名称。像这样:

numbers list1 list2 list3 list4
399826 True True False False
399827 True False True False
413350 True False False False
412450 False True True False
etc ... ... ... ...

为了比较列表,我使用了函数here

def returnNotMatches(a, b):

    a = set(a)
    b = set(b)
    return list(b - a)

但我不知道如何正确制作数据框。

【问题讨论】:

    标签: python pandas list


    【解决方案1】:

    首先为新列名按列创建字典,然后在值中使用Trues 创建dicts,然后创建DataFrame,最后将NaNs 替换为Falses:

    list1 = [399826, 399827, 413350, 404450, 399827, 404451]  
    list2 = [399825, 399826, 412450, 403650, 391227]  
    list3 = [412450, 399827]  
    list4 = [399829, 399246, 513350, 404370, 789827, 439931, 404451]  
    
    d = {'list1':list1,'list2':list2,'list3':list3,'list4':list4 }
    
    df  = pd.DataFrame({k: dict.fromkeys(v, True) for k, v in d.items()}).fillna(False)
    print (df)
            list1  list2  list3  list4
    399826   True   True  False  False
    399827   True  False   True  False
    413350   True  False  False  False
    404450   True  False  False  False
    404451   True  False  False   True
    399825  False   True  False  False
    412450  False   True   True  False
    403650  False   True  False  False
    391227  False   True  False  False
    399829  False  False  False   True
    399246  False  False  False   True
    513350  False  False  False   True
    404370  False  False  False   True
    789827  False  False  False   True
    439931  False  False  False   True
    

    【讨论】:

      【解决方案2】:

      数据:

      >>> list1 = [399826, 399827, 413350, 404450, 399827, 404451]  
      >>> list2 = [399825, 399826, 412450, 403650, 391227]  
      >>> list3 = [412450, 399827]  
      >>> list4 = [399829, 399246, 513350, 404370, 789827, 439931, 404451]  
      >>> import pandas as pd
      >>> df = pd.DataFrame(list1+list2+list3+list4, columns=['values'])
      >>> for i in range(1,5):
      >>>     v = 'list' + str(i)
      >>>     df[v] = df['values'].apply(lambda x:x in eval(v))
      >>> df
      
      
          values  list1   list2   list3   list4
      0   399826  True    True    False   False
      1   399827  True    False   True    False
      2   413350  True    False   False   False
      3   404450  True    False   False   False
      4   399827  True    False   True    False
      5   404451  True    False   False   True
      6   399825  False   True    False   False
      7   399826  True    True    False   False
      8   412450  False   True    True    False
      9   403650  False   True    False   False
      10  391227  False   True    False   False
      11  412450  False   True    True    False
      12  399827  True    False   True    False
      13  399829  False   False   False   True
      14  399246  False   False   False   True
      15  513350  False   False   False   True
      16  404370  False   False   False   True
      17  789827  False   False   False   True
      18  439931  False   False   False   True
      19  404451  True    False   False   True
      
      

      【讨论】:

        【解决方案3】:

        创建explodecrosstab的dic

        d = {'list1':list1,'list2':list2,'list3':list3,'list4':list4 }
        s = pd.Series(d).explode()
        s = pd.crosstab(s,s.index).astype(bool)
        Out[67]: 
        col_0   list1  list2  list3  list4
        row_0                             
        391227  False   True  False  False
        399246  False  False  False   True
        399825  False   True  False  False
        399826   True   True  False  False
        399827   True  False   True  False
        399829  False  False  False   True
        403650  False   True  False  False
        404370  False  False  False   True
        404450   True  False  False  False
        404451   True  False  False   True
        412450  False   True   True  False
        413350   True  False  False  False
        439931  False  False  False   True
        513350  False  False  False   True
        789827  False  False  False   True
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-11-28
          • 1970-01-01
          • 2011-02-06
          • 1970-01-01
          • 2022-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多