Python 来自不同长度列表的dict的数据帧

Python 来自不同长度列表的dict的数据帧,python,pandas,Python,Pandas,我的口述如下: d = {1: ['A'], 2: ['A', 'B'], 3: ['B', 'C']} (每个值都是从给定列表中选择的任意数量项目的列表,此处['a'、'B'、'C']) 我找不到获取以下数据帧的简单方法: A B C 1 1 0 0 2 1 1 0 3 0 1 1 有没有一种内在的方法可以做到这一点 编辑:我可以使用所有可能值的列表(此处:['A','B','C'])我相信您需要对字典进行一些转换,才能将其转换为您给定的数据帧 使用Python 2.7+词典理解的示

我的口述如下:

d = {1: ['A'], 2: ['A', 'B'], 3: ['B', 'C']}
(每个值都是从给定列表中选择的任意数量项目的列表,此处
['a'、'B'、'C']

我找不到获取以下数据帧的简单方法:

  A B C
1 1 0 0
2 1 1 0
3 0 1 1 
有没有一种内在的方法可以做到这一点


编辑:我可以使用所有可能值的列表(此处:['A','B','C'])

我相信您需要对字典进行一些转换,才能将其转换为您给定的数据帧

使用Python 2.7+词典理解的示例-

d = {k:{kv:v.count(kv) for kv in ['A','B','C']} for k,v in d.items()}
df = pd.DataFrame(d).T
或者在一行中-

df = pd.DataFrame({k:{kv:v.count(kv) for kv in ['A','B','C']} for k,v in d.items()}).T
演示-

In [18]: d = {1: ['A'], 2: ['A', 'B'], 3: ['B', 'C']}

In [19]: d = {k:{kv:v.count(kv) for kv in ['A','B','C']} for k,v in d.items()}

In [20]: df = pd.DataFrame(d).T

In [21]: df
Out[21]:
   A  B  C
1  1  0  0
2  1  1  0
3  0  1  1
你可以简单地:

d = {1: ['A'], 2: ['A', 'B'], 3: ['B', 'C']}

print '  A B C'
for key,value in d.iteritems():
    print key, value.count('A'), value.count('B'), value.count('C')
输出:

  A B C
1 1 0 0
2 1 1 0
3 0 1 1
   A  B  C
1  1  0  0
2  1  2  0
3  0  1  2

您可以轻松地概括代码,以迭代所有键的所有可用值。

没有内置的方法来执行您想要的操作,这将有效地获取计数并获取所有可能的值,而无需手动输入,创建一个存储有值计数的计数器的dict,然后迭代唯一可能值的列表,并在计数器中进行查找:

d = {1: ['A'], 2: ['A', 'B',"B"], 3: ['B', 'C',"C"]}
from collections import Counter

unique = list(chain.from_iterable(d.values()))
out = {}
counts = {k: Counter(v) for k, v in d.items()}
for k, v in d.items():
    cnt = counts[k]
    out[k] = {k:cnt[k] for k in unique}
df = pd.DataFrame(out)
print(df.T)
输出:

  A B C
1 1 0 0
2 1 1 0
3 0 1 1
   A  B  C
1  1  0  0
2  1  2  0
3  0  1  2
计数器
方法比使用
list.count
更有效

如果每个值中只有一个值,则使用集合方法就足够了:

unique = set(chain.from_iterable(d.values()))
out = {}
for k, v in d.items():
    un = unique.difference(v)
    out[k] = {k: 0 if k in un else 1 for k in unique}
df = pd.DataFrame(out)

适用于任意数量值的通用算法:

d = {1: ['A'], 2: ['A', 'B'], 3: ['B', 'C']}
# list of unique values
unique = list(set([v for val in d.values() for v in val]))

print ' ', ' '.join([str(i) for i in unique])
for k, v in d.items():
    print k, u' '.join([str(1 if unique[i] in v else 0) for i in xrange(len(unique))])

没有解释的否决票不会帮助任何人提高自己,像这样糟糕的事情仍在发生。这也是事实:-)否决票的人是否介意评论否决票的原因,这是我改进答案的唯一方法。这基本上只是我在答案中已经有的效率较低,如果不打算利用集合,为什么要使用集合?为什么要调用集合上的列表和索引,而不是简单地迭代集合?使用in使循环成为二次循环,因此它与使用count基本相同