繁体   English   中英

从两个列表创建唯一的数据框

[英]Creating Unique Data Frame from Two Lists

我有两个列表,我正在尝试创建一个矩阵(或数据框),其中包含 list2 中的值在 list1 的每个子列表中的次数:

list1 = [['texas','california','illinois'],['illinois','montana'],['new york','iowa'],['florida'],['north carolina']]
list2 = ['california','illinois','maine','oregon','wisconsin','florida']

count = 0
countx = 0
i = 0

for item in list1:
    while i < len(list2):
        x = list1[count].count(list2[countx])
        print(list2[countx],x)
        countx = countx + 1
        i = i + 1

输出:

california 1
illinois 1
maine 0
oregon 0
wisconsin 0
florida 0

上面的代码遍历第一个子列表并打印输出。 我不知道如何让它移动到下一个子列表,同时确保 list2 也被循环。

我的最终愿景是让矩阵在左侧具有每个子列表,并且列标题为列表 2。

                                   california  illinois  maine  oregon  wisconsin  florida
['texas','california','illinois']     1           1        0      0        0          0 
['illinois','montana']                0           1        0      0        0          0  
etc.

使用pandas.Series.str.contains

s = pd.Series(list1)
df = pd.DataFrame({k: s.str.contains(k, regex=False) 
                   for k in list2},
                  dtype=int).set_index(s)
print(df)

输出:

                               california  illinois  maine  oregon  wisconsin  \
[texas, california, illinois]           1         1      0       0          0   
[illinois, montana]                     0         1      0       0          0   
[new york, iowa]                        0         0      0       0          0   
[florida]                               0         0      0       0          0   
[north carolina]                        0         0      0       0          0   

                               florida  
[texas, california, illinois]        0  
[illinois, montana]                  0  
[new york, iowa]                     0  
[florida]                            1  
[north carolina]                     0  

虽然不清楚将列表作为索引值的价值是什么,但这里有一段相当简单的代码,可以完全满足您的要求:

import pandas as pd

list1 = [['texas', 'california', 'illinois'],
         ['illinois', 'montana'],
         ['new york', 'iowa'],
         ['florida'],
         ['north carolina']]
list2 = ['california', 'illinois', 'maine', 'oregon', 'wisconsin', 'florida']

df = pd.DataFrame()
for x1 in list1:
    df = df.append(pd.DataFrame([[x1, *[x1.count(x2) for x2 in list2]]], columns=['index', *list2]).set_index('index'))

print(df)

结果:

                               california  illinois  ...  wisconsin  florida
index                                                ...                    
[texas, california, illinois]           1         1  ...          0        0
[illinois, montana]                     0         1  ...          0        0
[new york, iowa]                        0         0  ...          0        0
[florida]                               0         0  ...          0        1
[north carolina]                        0         0  ...          0        0

[5 rows x 6 columns]

这是一种快速实施但时间缓慢的方法。

for item2 in list2:
    count = 0
    for l in list1:
        for item in l:
            if item == item2:
                count += 1
    print(item2, count)

我意识到这不会创建矩阵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM