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基本相同