我有两个计数器集合C1和C2,它们有相似的数据集,但计数不同(假设C1和C2是一组人拥有的苹果和橘子的数量)。
我想把这两个集合合并成一个看起来像
{
Person1: [1, 2],
Person2: [5, 1],
...
}我还没有决定存储合并计数(也许是列表)的数据结构,以便轻松地将它们写入csv文件,#Appleand橙是单独的列。在python集合中有很多我不知道的技巧,我正在寻找最小的代码大小。谢谢。
编辑:从下面的答案中,我觉得我的问题不像我想的那么清楚,让我详细说明我到底想要什么:让我有两个计数器集合c1和c2:
c1 = [
('orange', 10),
('apple', 20)
]
c2 = [
('orange', 15),
('apple', 30)
]我想将这两个集合合并到一个dict中,这样看起来如下:
merged = {
'orange': [10, 15],
'apple': [20, 30]
}或其他数据结构,可以很容易地转换和输出到csv格式。
发布于 2015-12-22 19:53:21
您可以使用来自defaultdict()模块的collections存储合并结果,然后使用来自itertools模块的chain()。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]})
>>> 发布于 2015-12-22 19:56:23
利用大熊猫:
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')如果计数器的密钥不完全相同,这也是有效的。会有钥匙只出现在另一个柜台的NaNs。
发布于 2021-02-04 11:23:27
如果按照指定的方式开始形成计数器集合,则可以使用Counter.update()函数。我还添加了项banana,它只在一个计数器集合中。请注意,在update上使用的Counter会将值添加到键中。这与在update上使用的值被替换(!)的情况形成了对比。通过更新(检查docs: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 + c2https://stackoverflow.com/questions/34423051
复制相似问题