我有两个Counter系列C1和C2,他们有相似的数据集,但计数不同(认为C1和C2是一群人拥有的苹果和橙子的数量)。
我想将这两个集合合并为一个看起来像
的字典{
Person1: [1, 2],
Person2: [5, 1],
...
}
我还没有决定用什么数据结构存储合并计数(可能是列表),以便轻松地将它们写入csv文件,其中苹果和橙子是单独的列。在python集合中有很多我不知道的技巧,我正在寻找最小的代码大小。感谢。
编辑:从下面的答案中,我觉得我的问题不像我想的那么清楚,让我详细说明我在寻找什么: 让我有两个Counter集合c1和c2:
c1 = [
('orange', 10),
('apple', 20)
]
c2 = [
('orange', 15),
('apple', 30)
]
我想将这两个集合合并为一个单独的dict,如下所示:
merged = {
'orange': [10, 15],
'apple': [20, 30]
}
或其他可以轻松转换并输出为csv格式的数据结构。
答案 0 :(得分:1)
您可以使用defaultdict()
模块中的collections
来存储合并后的结果,然后使用chain()
模块中的itertools
。 chain
在这里做的是它使一个迭代器返回每个“计数器”中的元素,让你避免编写一个嵌套循环。
>>> from collections import defaultdict
>>> from itertools import chain
>>> c1 = [
... ('orange', 10),
... ('apple', 20)
... ]
>>> c2 = [
... ('orange', 15),
... ('apple', 30)
... ]
>>> merged = defaultdict(list)
>>> for item in chain(c1, c2):
... merged[item[0]].append(item[1])
...
>>> merged
defaultdict(<class 'list'>, {'apple': [20, 30], 'orange': [10, 15]})
>>>
答案 1 :(得分:1)
使用pandas:
import pandas as pd
from collections import Counter
c1 = Counter('jdahfajksdasdhflajkdhflajh')
c2 = Counter('jahdflkjhdazzfldjhfadkhfs')
df = pd.DataFrame({'apples': c1, 'oranges': c2})
df.to_csv('apples_and_oranges.csv')
如果计数器的键不完全相同,这也适用。会有NaN,其中密钥只出现在另一个柜台中。
答案 2 :(得分:0)
如果您按照指定的方式从计数器集合开始,则可以使用 Counter.update()
函数。我还添加了项目 banana
,它仅在一个柜台集合中。请注意,在 update
上使用的 Counter
会将值添加到键中。这与在 update
上使用的 dict
形成对比,其中值被更新替换 (!)(检查文档:https://docs.python.org/3/library/collections.html#collections.Counter.update)。
from collections import Counter
import pandas as pd
c1 = [('orange', 10),('apple', 20)]
c2 = [('orange', 15),('apple', 30),('banana',5)]
c = Counter()
for i in c1: c.update({i[0]:i[1]})
for i in c2: c.update({i[0]:i[1]})
但是,如果您从一个值列表开始,您可以为每个列表构造一个 Counter
并添加计数器
c1 = Counter(['orange'] * 10 + ['apple'] * 20)
c2 = Counter(['orange'] * 15 + ['apple'] * 30 + ['banana']* 5)
c = c1 + c2
现在我们可以将计数器写入 csv 文件
df = pd.DataFrame.from_dict(c, orient='index', columns=['count'])
df.to_csv('counts.csv')
另一种方法是将计数器集合转换为 dicts
并将其形成为 Counters
,因为您正在寻找较小的代码大小
c1 = Counter(dict([('orange', 10),('apple', 20)]))
c2 = Counter(dict([('orange', 15),('apple', 30),('banana',5)]))
c = c1 + c2