我有这个df:
import pandas as pd
a = [1,1,1,2,2,3,3,3,3,4,4,5,5,5]
b = ["pi","pi","k","J","pi","pi","k","k","J","pi","k","pi","k","pi"]
bin0 = [0,0,0,1,0,0,1,0,0,0,1,1,0,0]
bin1 = [1,1,1,0,1,0,0,1,1,0,0,0,1,0]
bin2 = [0,0,0,0,0,1,0,0,0,1,0,0,0,1]
df_test = pd.DataFrame({"a": a, "b": b,"bin0": bin0,"bin1": bin1,"bin2":
bin2})
赞:
a b bin0 bin1 bin2
0 1 pi 0 1 0
1 1 pi 0 1 0
2 1 k 0 1 0
3 2 J 1 0 0
...
12 5 k 0 1 0
13 5 pi 0 0 1
然后,我想根据此df创建字典,并对具有相同密钥的那些字典求和:
from collections import Counter
thismodule = sys.modules[__name__]
df1 = df_test.groupby(['a', 'b']).agg({'b':'size', 'bin0':'sum',
'bin1':'sum', 'bin2':'sum'}).rename(columns={'b': 'cant', 'bin0': 'b0',
'bin1': 'b1', 'bin2': 'b2'}).reset_index(drop = False)
for evt in df1.a.unique():
name1 = 'dict_'+str(evt)
name2 = 'col_'+str(evt)
df_ = df1
df_ = df_[df_.a==evt].drop('a', 1).set_index('b').to_dict('index')
setattr(thismodule, name1, df_)
setattr(thismodule, name2, col_)
获取,例如:
df_1 = {'k': {'cant': 1, 'b0': 0, 'b1': 1, 'b2': 0}, 'pi': {'cant': 2,
'b0': 0, 'b1': 2, 'b2': 0}}
col_1 = Counter({'k': {'cant': 1, 'b0': 0, 'b1': 1, 'b2': 0}, 'pi':
{'cant': 2, 'b0': 1, 'b1': 0, 'b2': 1}})
最后,当我想对具有相同键的字典的值求和时,会出现错误:
col_1 = eval("col_1")
col_2 = eval("col_2")
sumdict = col_1 +col_2
print(sumdict)
错误是:
newcount = count + other[elem]
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
答案 0 :(得分:1)
您会在这里进行很多疯狂的事情,我认为这可能是不必要的,并且我强烈建议(eval
,setattr
),但仅回答有关汇总值的问题。两个带有共享密钥的计数器:
from collections import Counter
cx = Counter(x)
cy = Counter(y)
totals = {k:cx.get(k,0) + cy.get(k,0) for k in (set(cx) | set(cy))}
print(totals)
您将两个字典键的并集进行迭代,然后对其进行迭代,然后使用Counter.get(key, default)
方法获取关联键的值,并提供一个不存在的后备默认值。
这是字典理解,但您也可以这样做:
for k in (set(cx) | set(cy)):
total = cx.get(k,0) + cy.get(k,0)
print(k, total)
例如,使用使用以下数据构建的数据:
from random import choice
x = [choice("abcdefg") for _ in range(100)]
y = [choice("abcdefg") for _ in range(100)]
y.extend(["z"] * 3)
答案 1 :(得分:1)
这不是您想要实现的目标吗?
df_test.groupby(['a', 'b']).sum().reset_index().groupby('a').sum()
bin0 bin1 bin2
a
1 0 3 0
2 1 1 0
3 1 2 1
4 1 0 1
5 1 1 1
答案 2 :(得分:0)
尝试使用dict的update()方法 https://www.tutorialspoint.com/python/dictionary_update.htm
count.update(other [elem])